批量更新在Grails中



我正在使用Grails 2.2.2和MySQL数据库。我的表中有800个记录(这会随着时间的推移增加)。我必须将特定的列值更新为新值基于一些计算。请提出一种不会影响性能的方法。

在这种情况下,我通常每1000个左右对会话进行冲洗:

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

我通过使用Model.withTransaction()方法在多个实例上使用Model.save()时允许批处理更新解决了此问题,使用以下链接:http://wwwwwwww.tothenew.com/blog/blog/bact - 加工/

例如:

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行。

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

您可以绕过Grails Gorm,然后下降到HQL级别以插入或更新对象,这将减少您获得OutofMemory例外的机会,因为不会有验证对象,错误和其他来消耗内存。另一种方法是每次插入或更新后清除会话,清除验证错误和对象。

相关内容

  • 没有找到相关文章

最新更新