WebSphere 6.1中的长事务导致OutOfMemoryException

时间:2011-04-11 11:49:46

标签: hibernate spring transactions websphere out-of-memory

我正在运行同步/批处理作业(synchronizeXXX()在一个长时间运行的事务中使用 Hibernate 3.2.5GA / Spring 2.5.6 在Oracle数据库中插入111821条记录(> 4小时)但是在大约2小时/ 50000条记录中出现OutOfMemory异常后失败 虽然我每20次插入清除并刷新,但它看起来仍然像Hibernate / Websphere / Spring(?)在会话中持有大量对象。

有趣的是:内存使用率最初是正常的,但大约在20/30分钟内存使用量开始增加并增长,直到OutOfMemory发生(未显示在PDF中,因为它已滚动/清除或其他内容)。我尝试从3.2.5升级Hibernate 到3.3.2GA,但同样的问题仍然存在。 当我增加最大堆大小时,OutOfMemory就会出现。

我用谷歌搜索并发现了一些“类似”的问题,但是他们使用Hibernate来管理事务而不是Spring,所以我想提到的修复与我无关(?)。见Simular issues

我分析了堆转储,并使用IBM Support Agent 4.1进行了一些分析。所有结果/屏幕截图和更多详细信息都包含在PDF 中:请参阅OutOfMemory analysis (PDF 586KB)

感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

即使你正在做清理并且不时刷新Hibernate会话和事务仍然是开放的,并且在你的情况下看起来似乎没有工作。

这里的选项似乎是:

a)使用无状态会话:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html

b)使用SQL查询,以便hibernate无法保存任何内容

c)使用多笔交易

这里没有很好的解决方案,所以只为您选择最佳选择:(