Tomcat jdbc连接池 - Pool-Cleaner Memory Leak

时间:2015-09-22 05:49:38

标签: java mysql tomcat jdbc memory-leaks

我已经在互联网上搜索了一天以上,但仍然无法找到可行的解决方案。我正在使用MySQL Connector / J 5.1.35和Tomcat JDBC连接池与Tomcat 6.0.32,我无法启动/停止/重新加载现有的Web应用程序,而tomcat jdbc清理器池线程无法停止并导致内存泄漏。我已经尝试了一些我能在网上找到的关于它的东西,我仍然有同样的问题。如果我停止容器,那么无关紧要,因为一旦容器停止,螺纹就会死了。但是,因为我没有停止容器,只是停止应用程序,BAM! - 内存泄漏。

这是令人沮丧的,你会认为Apache会有一个详细的解决方案,但他们没有。

任何人都知道如何一劳永逸地解决这个问题?

哦,是的 - 我取消注册驱动程序并在ServletContextListener中运行AbandonedConnectionCleanupThread.shutdown(),并尝试在$ CATALINA_HOME / lib和WEB-INF / lib中部署驱动程序,但仍然遇到同样的问题

更新

看起来连接池可能不是问题。如果我使用DBCP,我不会得到有关内存泄漏的错误,但如果我在管理器页面上运行“Find Leaks”,Tomcat肯定会发现应用程序中的泄漏 - 只是从启动它,运行从数据库读取的操作,然后停止它。如果我只是开始/停止它,那么没有报告任何问题。我确保所有连接/语句/结果集都已正确关闭。如果我切换回Tomcat JDBC,我仍然有同样的问题,它只是在应用程序的停止/重启期间被报告(至少据我所知)因为[Pool-Cleaner]线程无法停止,当点击“查找泄漏”按钮时,管理器会发现泄漏。

2 个答案:

答案 0 :(得分:2)

您的JDBC驱动程序应位于$ CATALINA_HOME / lib中,并且应使用<Resource>标记在server.xml文件中配置数据库连接池。然后,webapp的 context .xml文件应链接到带有<ResourceLink>标记的全局数据源。

这种方式连接是全局的,并且由连接到同一数据库的所有webapp共享。当webapp停止或重新启动时,不会释放连接,因为它们不属于webapp,它们属于Tomcat。

没有数据库连接内存泄漏,假设您的所有webapp servlet /处理程序都在finally块中正确地清理了它们的资源。

FYI:驱动程序的Deregistring不会释放任何资源,例如打开Connections,Statements和ResultSet。它只是阻止创建新连接。

答案 1 :(得分:0)

好的,发现这并不是与JDBC(face-palm)有关。事实证明这是一个RMI问题,所以我现在将重新发布这个问题作为一个新问题。

感谢大家的时间。