2013-03-25 24 views
5

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

findAllWhere 
findAllBy 
list 
... 
  • 他们是满载(分别为他们的代理人)到记忆?
  • 如果我用each/every/any遍历它们,它们是否支持一个迭代器来加载它们?
  • 我更喜欢createCriteria() {...}.scroll()以获得更好的内存使用情况吗?
+0

您使用哪个DB来支持GORM? – noamt 2013-05-05 08:38:04

+0

可以说预打包数据库的HSQL或H2。但我希望GORM不依赖于数据库... – matcauthon 2013-05-13 06:18:19

+0

嗯,它不能独立,因为它必须使用数据库驱动程序与不同的数据库连接。例如,GORM使用Mongo Java驱动程序与MongoDB进行交互,并使用Jedis与Redis进行交互。除此之外,你还有Spring Data框架。 – noamt 2013-05-13 07:30:12

回答

1

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

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

回顾这些类我们可以看到,它会返回多个结果查询始终组装成DetachedCriteria总是调用criteria.list()方法;这意味着整个结果批次被组装并保存在内存中。使用遍历结果Groovy的收集方法将不会产生任何影响,因为实质上是在返回的结果列表上调用这些方法。

至于问题“怎样的结果域多装载?” - 这取决于域的成分,但你可以假设域的领域加载,任何协会默认懒惰

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

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