批量更新grails

时间:2014-03-09 06:01:43

标签: grails batch-updates bulkupdate

我正在使用grails 2.2.2和mysql数据库。我的表中有800条记录(随着时间的推移会增加)。我必须根据某些计算将特定列值更新为新值。请建议一种不影响性能的方法。

3 个答案:

答案 0 :(得分:3)

在这种情况下,我通常每1000个左右的对象刷新一次会话:

SomeDomain.list().eachWithIndex{ obj, ix ->
  obj.doSomeCalc()
  obj.save flush:0 == ix % 1000
}

答案 1 :(得分:2)

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

例如:

List batch = []
(0..1000).each {
    Model model = new Model(...)
    batch.add(model)
    Model.withTransaction {
        for (Model m in batch) {
            m.save()
        }
    }
}

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

在此更新之前,使用save()更新行需要53秒,现在需要794毫秒才能更新800行。

答案 2 :(得分:0)

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

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