0

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

4

3 回答 3

3

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

SomeDomain.list().eachWithIndex{ obj, ix ->
  obj.doSomeCalc()
  obj.save flush:0 == ix % 1000
}
于 2014-03-09T15:38:02.850 回答
3

我通过使用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()定期清除它。

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

于 2014-03-09T19:41:14.287 回答
0

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

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

于 2014-03-09T15:32:52.167 回答