2011-04-11 56 views
0

我正在運行一個同步/批處理作業(synchronizeXXX(),它在一個長時間運行的事務中使用Hibernate 3.2.5GA/Spring 2.5.6在Oracle數據庫中插入111821條記錄> 4小時)但在大約2小時/ 50000條記錄出現OutOfMemory異常後失敗
儘管我做了清除並刷新了每20個插入一次,它仍然看起來像Hibernate/Websphere/Spring(?)持有在會話中一個gazillion對象WebSphere 6.1中的長事務導致OutOfMemoryException異常

有趣的是:內存使用情況最初是正常的,但大約20/30分鐘後內存使用開始增加並增長,直到OutOfMemory發生(PDF中未顯示,因爲它已滾出/清除或某物)。我嘗試將Hibernate從3.2.5 升級到3.3.2GA,但同樣的問題依然存在。 當我增加最大堆大小時,OutOfMemory會稍後出現。

我搜索了一下,發現了一些'類似'的問題,但他們使用Hibernate來管理事務而不是Spring,所以我想所提到的修復與我無關(?)。請參閱Simular issues

我分析了堆轉儲並使用IBM Support Agent 4.1做了一些分析。所有結果/屏幕截圖和更多詳細信息包含在PDF中:請參閱OutOfMemory analysis (PDF 586KB)

任何幫助表示讚賞!

回答

0

即使您正在清理並刷新Hibernate會話和事務仍然是打開和清除似乎不工作,因爲它應該在你的情況。

在這裏選擇似乎是:

a)使用無狀態會話:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html

B)使用SQL查詢,因爲Hibernate不能裝東西

c)用幾個交易

有在這裏沒有很好的解決方案,所以只是看重你最好的選擇:(

+0

謝謝。c)不是我們的選擇。我可以使用a)如果我已經生成了密鑰(Oracle中的序列)?如果是這樣,我必須插入我認爲的所有成員/集合。順便說一句:我們正在考慮遷移到PL/SQL,因爲現在的性能非常顯着:由於數據(一個大的XML文件)已經存在於Clob中的數據庫中,這會加快速度。 – rwijngaa 2011-04-12 13:35:17

+0

從來沒有使用無狀態會話,但我知道你必須逐一插入每個元素,並從孩子到父親,所以一切都應該結束。將所有東西移動到PL/SQL都可以成爲解決方案,但是可能使用b)允許使用Java的XML解析功能,應該大大減少處理時間並同時避免緩存問題,只需通過Hibernate發送SQL即可。 – frisco 2011-04-12 14:27:32

+0

btw。我在spring配置中使用了另一個transactionmanager(一些標準的HibernateTX管理器;我必須查看它),並且中提琴的內存使用情況穩定了兩個小時!然後,它超時了,但我想這是另一個問題;-) – rwijngaa 2011-04-18 18:59:14