2009-05-29 106 views
5

我們剛剛開始使用Hibernate,並且仍在習慣它的工作方式。如何在會話關閉後強制hibernate釋放內存?

我們已經看到的事情是,即使在所有會話關閉並且引用已經超出範圍之後,hibernate仍然似乎將之前使用的數據庫值保留在其緩存中。

我們有從多組表中讀取多次的代碼。因爲所有的內存都非常節制地釋放,所以後來傳遞的速度變慢了。

有什麼辦法強制Hibernate清除它的緩存嗎?

對System.gc()的顯式調用沒有幫助。 (是的,我知道這是一個建議)

附加信息:我們明確地禁用了二級緩存。

+3

我假設你不使用Hibernate的二級緩存呢?您使用什麼策略進行會話管理? 「會話每線程」? – 2009-05-29 22:14:57

+0

我們使用的是session-per-thread,並且我們已經明確地禁用了二級緩存 – StudioEvoque 2009-05-30 18:31:57

回答

10

您可以嘗試調用Session.clear強制清除第一級緩存。請務必首先調用Session.flush,將任何掛起的更改寫入數據庫。如果這樣「修復」了問題,那麼我懷疑某些東西仍然持有對會話的引用,從而阻止了緩存中的對象被垃圾收集。您可能需要獲得程序的堆轉儲來追蹤泄漏。

+0

它「修復了」這個問題:) 正如你所建議的,我們正在審查一些我們創建的「HibernateUtils」堅持會議參考。 – StudioEvoque 2009-06-02 16:38:51

2

Hibernate還有一個可選的二級緩存可以在場。我同意Rob的看法,最簡單的方法是在會話結束後查看內存中的內容。

我目前最喜歡的工具是YourKit這是商業和不完全便宜。他們曾經提供(並且可能仍然會提供)非常便宜的個人許可選項(99美元IIRC)。在解決Alfresco ECM的堆使用問題時,我已經使用YourKit來完成此任務。還有其他工具可用(例如CodeGear JGears),我也瞭解它也很好。

你可能會考慮在評估模式下使用的產品 - 如果發現您的問題,它可能會物盡其)