Grails GORM方法的内存使用情况

时间:2013-03-25 12:06:59

标签: grails gorm

我想知道grails如何通过GORM方法处理内存使用和域对象的加载(获取),如:

findAllWhere
findAllBy
list
...
  • 它们是否完全加载(分别是它们的代理)到内存中?
  • 如果我用each/every/any遍历它们,它们是否会被一个迭代器支持懒惰加载它们?
  • 为了更好的内存使用,我应该更喜欢createCriteria() {...}.scroll()吗?

1 个答案:

答案 0 :(得分:1)

假设我们忽略了GORM使用的每种类型的数据库驱动程序的不同行为,我们可以在代码和文档中找到答案。

动态查找器由org.grails.datastore.gorm.GormStaticApiorg.grails.datastore.gorm.finders包中的查找程序类提供给域类。

回顾这些类,我们可以看到返回多个结果的查询总是汇总为DetachedCriteria始终调用criteria.list()方法;这意味着整个结果批处理被组装并保存在内存中。使用 Groovy的集合方法遍历结果将没有任何区别,因为您实际上是在返回的结果列表上调用这些方法。

关于“加载了多少结果域?”的问题 - 这取决于域的组成,但您可以假设已加载域的字段并且默认情况下任何关联都是懒惰的

在需要更好内存使用的场景中,您当然可以自行组合标准并结合结果投影并使用scroll(请注意,此功能取决于数据库的类型)。

在极端情况下,我甚至绕过GORM并直接使用数据库驱动程序。