2013-03-25 43 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並直接使用數據庫驅動程序。