系统中极大量的com.mysql.jdbc.StatementImpl $ CancelTask​​对象导致OOM异常

时间:2011-04-25 12:20:49

标签: mysql hibernate jdbc jboss

我正在使用jboss 4.2.3和mysql-connector-5.1.8。我的应用程序正在进行大量的数据库读取(数量惊人的数量级)和写入的意义。在一段时间内,jboss因OOM异常而崩溃。当我检查堆转储时,我看到了大量的 com.mysql.jdbc.StatementImpl$CancelTask对象大约有400万,占用了数百MB的数据 这是内存泄漏吗?究竟它用于什么以及如何禁用它?

由于我使用带有ejb注入的实体管理器的Container Managed事务,我认为没有明确的close需要。在进一步挖掘时,我发现查询事务超时设置为30分钟,启用了查询超时。在计时器到期之前,CancelTask对象看起来一直存在。一旦减少了事务超时,就会在计时器到期时清除这些对象

3 个答案:

答案 0 :(得分:2)

我在 tomcat 上使用与 MySql 驱动程序的数据库连接池有类似的问题:有JDBCResultSetStatementImpl个对象加载没有删除的堆。经过长时间的搜索后,我发现在 tomcat context.xml 文件中设置 datasource maxAge参数有帮助。

答案 1 :(得分:0)

如果没有看到某些代码,那么很难回答你的问题......还是......

我预感到您没有正确关闭JDBC资源(连接/语句/结果集)。据我所知,当查询超时时,会创建这些CancelTask​​对象。

答案 2 :(得分:0)

打开数据源或连接池中已放弃连接的日志记录。你可能会错过关闭某些连接。如果是这种情况,您可以设置remove abandoned as true,但这不是在您完成查询后正确关闭会话和数据库连接的替代方法。