2010-09-09 90 views
0

我正在使用線程本地來管理我的休眠會話。最近,我在生產服務器上看到OutOfMemory異常。我在heap_dump上運行了Eclipse MAT,並且看到很多我的會話沒有被垃圾收集,即使它們由於被tomcatse ThreadWithAttributes對象引用而被關閉。這使我瘋狂,現在我在不同的論壇上看到很多有類似問題的帖子,但沒有答案。任何援助將不勝感激。Threadlocal引用休眠會話impl,導致會話impl不會被垃圾收集

感謝

回答

0

如果您在Web應用程序中使用Hibernate的會話,不要讓ThreadLocal中的Session對象跨請求呆在那裏 - 因爲你必須在螺紋上沒有控制,無論如何,他們屬於容器。

如果您需要在Web請求的生命週期中創建和關閉Session,並且您不想在每個地方傳遞Session對象,則應該考慮編寫一個ServletFilter來處理清理 - 它將被調用圍繞每一個請求。您也可以讓該過濾器提交或回滾您可能已開始的任何交易。

你應該爲一個簡單的食譜要怎麼做閱讀此頁:http://community.jboss.org/wiki/OpenSessioninView

0

感謝您的回覆。我目前正在使用getCurrentSession()方法在視圖中使用打開的會話,這意味着會話按請求關閉transaction.commit()。我可以看到會話正在關閉(儘管沒有被清除),但ThreadWithAttributes tomcat類持有對sessionImpl的引用,從而防止垃圾收集。這發生在每個線程中。我的數據庫非常大,所以最多幾小時或一天之後會導致內存不足錯誤,並且服務器需要反彈。