我想知道 grails 如何通过 GORM 方法处理内存使用和加载(获取)域对象,例如:
findAllWhere
findAllBy
list
...
- 它们是否完全加载(分别是它们的代理)到内存中?
- 如果我遍历它们,
each/every/any
它们是否由一个迭代器支持,它们会懒惰地加载它们? - 我应该更喜欢
createCriteria() {...}.scroll()
更好的内存使用吗?
我想知道 grails 如何通过 GORM 方法处理内存使用和加载(获取)域对象,例如:
findAllWhere
findAllBy
list
...
each/every/any
它们是否由一个迭代器支持,它们会懒惰地加载它们?createCriteria() {...}.scroll()
更好的内存使用吗?假设我们忽略了 GORM 使用的每种类型的 DB 驱动程序的不同行为,我们可以在代码和文档中找到答案。
动态查找器由包org.grails.datastore.gorm.GormStaticApi
中的查找器类提供给域类org.grails.datastore.gorm.finders
。
查看这些类,我们可以看到返回多个结果的查询总是组装为 aDetachedCriteria
并且总是调用criteria.list()
方法;这意味着整个结果批次被组装并保存在内存中。使用 Groovy 的集合方法遍历结果不会有任何区别,因为您实际上是在返回的结果列表中调用这些方法。
至于“加载了多少结果域? ”这个问题 - 这取决于域的组成,但您可以假设域的字段已加载,并且默认情况下任何关联都是惰性的。
在需要更好内存使用的场景中,您当然可以结合结果预测和使用自行组合标准scroll
(请注意,此功能取决于数据库的类型)。
在极端情况下,我什至绕过 GORM 并直接使用 DB 驱动程序。