5
我想知道的Grails如何通过GORM方法,如处理内存使用率和域对象的加载(获取):内存使用
findAllWhere
findAllBy
list
...
- 他们是满载(分别为他们的代理人)到记忆?
- 如果我用
each/every/any
遍历它们,它们是否支持一个迭代器来加载它们? - 我更喜欢
createCriteria() {...}.scroll()
以获得更好的内存使用情况吗?
我想知道的Grails如何通过GORM方法,如处理内存使用率和域对象的加载(获取):内存使用
findAllWhere
findAllBy
list
...
each/every/any
遍历它们,它们是否支持一个迭代器来加载它们?createCriteria() {...}.scroll()
以获得更好的内存使用情况吗?假设我们忽略了GORM使用的每种数据库驱动程序的不同行为,我们可以在代码和文档中找到答案。
动态查找程序通过org.grails.datastore.gorm.GormStaticApi
和org.grails.datastore.gorm.finders
包中的查找程序类提供给域类。
回顾这些类我们可以看到,它会返回多个结果查询始终组装成DetachedCriteria
和总是调用criteria.list()
方法;这意味着整个结果批次被组装并保存在内存中。使用遍历结果Groovy的收集方法将不会产生任何影响,因为实质上是在返回的结果列表上调用这些方法。
至于问题“怎样的结果域多装载?” - 这取决于域的成分,但你可以假设域的领域加载,任何协会默认懒惰。
在需要更好内存使用情况下,您当然可以自行组合标准并结合预测结果并使用scroll
(请注意,此功能取决于数据库的类型)。
在极端情况下,我甚至绕过GORM并直接使用数据库驱动程序。
您使用哪个DB来支持GORM? – noamt 2013-05-05 08:38:04
可以说预打包数据库的HSQL或H2。但我希望GORM不依赖于数据库... – matcauthon 2013-05-13 06:18:19
嗯,它不能独立,因为它必须使用数据库驱动程序与不同的数据库连接。例如,GORM使用Mongo Java驱动程序与MongoDB进行交互,并使用Jedis与Redis进行交互。除此之外,你还有Spring Data框架。 – noamt 2013-05-13 07:30:12