我正在使用jboss 4.2.3和mysql-connector-5.1.8。我的应用程序正在进行大量的数据库读取(数量惊人的数量级)和写入的意义。在一段时间内,jboss因OOM异常而崩溃。当我检查堆转储时,我看到了大量的
com.mysql.jdbc.StatementImpl$CancelTask
对象大约有400万,占用了数百MB的数据
这是内存泄漏吗?究竟它用于什么以及如何禁用它?
由于我使用带有ejb注入的实体管理器的Container Managed事务,我认为没有明确的close需要。在进一步挖掘时,我发现查询事务超时设置为30分钟,启用了查询超时。在计时器到期之前,CancelTask
对象看起来一直存在。一旦减少了事务超时,就会在计时器到期时清除这些对象
答案 0 :(得分:2)
我在 tomcat 上使用与 MySql 驱动程序的数据库连接池有类似的问题:有JDBCResultSet
和StatementImpl
个对象加载没有删除的堆。经过长时间的搜索后,我发现在 tomcat context.xml 文件中设置 datasource 的maxAge
参数有帮助。
答案 1 :(得分:0)
如果没有看到某些代码,那么很难回答你的问题......还是......
我预感到您没有正确关闭JDBC资源(连接/语句/结果集)。据我所知,当查询超时时,会创建这些CancelTask对象。
答案 2 :(得分:0)
打开数据源或连接池中已放弃连接的日志记录。你可能会错过关闭某些连接。如果是这种情况,您可以设置remove abandoned as true,但这不是在您完成查询后正确关闭会话和数据库连接的替代方法。