我正在運行一個同步/批處理作業(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)
任何幫助表示讚賞!
謝謝。c)不是我們的選擇。我可以使用a)如果我已經生成了密鑰(Oracle中的序列)?如果是這樣,我必須插入我認爲的所有成員/集合。順便說一句:我們正在考慮遷移到PL/SQL,因爲現在的性能非常顯着:由於數據(一個大的XML文件)已經存在於Clob中的數據庫中,這會加快速度。 – rwijngaa 2011-04-12 13:35:17
從來沒有使用無狀態會話,但我知道你必須逐一插入每個元素,並從孩子到父親,所以一切都應該結束。將所有東西移動到PL/SQL都可以成爲解決方案,但是可能使用b)允許使用Java的XML解析功能,應該大大減少處理時間並同時避免緩存問題,只需通過Hibernate發送SQL即可。 – frisco 2011-04-12 14:27:32
btw。我在spring配置中使用了另一個transactionmanager(一些標準的HibernateTX管理器;我必須查看它),並且中提琴的內存使用情況穩定了兩個小時!然後,它超時了,但我想這是另一個問題;-) – rwijngaa 2011-04-18 18:59:14