2012-02-09 48 views
1

我主要使用Hibernate來減少我的應用程序的內存消耗,因爲我可以將數據存儲在數據庫而不是內存中。基本上,有一個主要實體Song代表從目錄加載的音樂文件,但是我在向數據庫添加歌曲(使用hibernate)之後執行的第一件事是將其添加到執行者管道中以供進一步處理,以便代表每首歌曲的對象仍然在記憶中,並保持如此狀態,直到歌曲處理完畢,所以我沒有節省太多內存。使用Hibernate的二級緩存是否可以減少內存使用量或只是數據庫訪問?

我的第一個想法是,當我將它們添加到pipleline時僅存儲歌曲的id,並且只在需要處理時纔得到實際的實體,但這似乎是對付而不是Hibernate。

相反,我想知道如果我將Ehcache與配置爲使用磁盤緩存的Hibernate配合使用,這意味着我使用的實例不會使用太多的內存,或者它們會像以前一樣使用盡可能多的內存,一旦我實際上有一個參考給我的應用程序中的他們。

回答

0

如果你有一個實體的引用,那麼顯然這個對象在內存中(除非引用是對一個延遲加載代理的引用)。

EHCache用於避免頻繁訪問數據庫,並從內存或磁盤緩存中獲取實體。使用它會增加內存,而不是減少它。

+0

好吧,和延遲加載類似地設計用於重新調用數據庫調用,而不是內存不是它,即使我選擇做懶惰加載,一旦它已經檢索更多然後最小它不會放手 – 2012-02-09 17:15:40

+1

編號延遲加載用於避免加載不需要加載的東西,同時仍然允許引用它。我不認爲在你的情況下使用代理將是一個解決方案。在管道中存儲ID對我來說看起來非常合適。我不明白你的第二句話。 – 2012-02-09 17:30:44

+0

我會嘗試改寫,如果你懶惰加載歌曲1它只會包含該歌曲的ID(或者它是歌曲表中包含的ID和所有簡單的字段)。然後,如果您必須使用需要對第二個表(如coverart)進行sql調用的字段,那麼會將coverart圖像添加到實體,然後該實體會繼續將該數據保存在內存中,直到您不再參考它爲止它永遠不會回覆到不包含coverart圖像的實體版本。 – 2012-02-09 17:39:15

相關問題