首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >grails中的批量更新

问grails中的批量更新
EN

Stack Overflow用户
提问于 2014-03-09 14:01:43
回答 3查看 6.1K关注 0票数 0

我使用的是grails 2.2.2和mysql database.There,我的表中有800条记录(随着时间的推移会增加).I必须根据一些计算将特定的列值更新为一个新值。请推荐一种不影响性能的方法。

EN

回答 3

Stack Overflow用户

发布于 2014-03-09 23:38:03

在这种情况下,我通常会刷新会话中的大约1000个对象:

代码语言:javascript
复制
SomeDomain.list().eachWithIndex{ obj, ix ->
  obj.doSomeCalc()
  obj.save flush:0 == ix % 1000
}
票数 3
EN

Stack Overflow用户

发布于 2014-03-10 03:41:14

我通过使用Model.withTransaction()方法解决了这个问题,该方法允许在多个实例上使用Model.save()时进行批量更新,使用以下链接:http://www.tothenew.com/blog/batch-processing-in-grails/

例如:

代码语言:javascript
复制
List batch = []
(0..1000).each {
    Model model = new Model(...)
    batch.add(model)
    Model.withTransaction {
        for (Model m in batch) {
            m.save()
        }
    }
}

此外,为了防止会话,您可以在方法中包含SessionFactory对象,获取当前的session对象,然后定期使用session.clear()清除它。

在这次更新之前,使用save()更新行需要53秒,现在更新800行需要794ms。

票数 3
EN

Stack Overflow用户

发布于 2014-03-09 23:32:52

这可能会有帮助:http://geekcredential.wordpress.com/2012/05/25/bulk-insert-with-grails/

你可以绕过grails GORM,进入HQL级别来插入或更新对象,这将减少你得到一个outofmemory异常的机会,因为不会有验证对象,错误和其他消耗内存的东西。另一种方法是刷新会话,在每次插入或更新后清除验证错误和对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22278992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档