Java Tomcat jdbc连接池-池清理器内存泄漏

Java Tomcat jdbc连接池-池清理器内存泄漏,java,mysql,tomcat,jdbc,memory-leaks,Java,Mysql,Tomcat,Jdbc,Memory Leaks,我在互联网上搜索了一天多,似乎仍然找不到有效的解决方案。我在Tomcat 6.0.32中使用MySQL连接器/J 5.1.35和Tomcat JDBC连接池,如果没有Tomcat JDBC cleaner池线程无法停止并导致内存泄漏,我无法启动/停止/重新加载现有的Web应用程序。我已经尝试了所有我能在网上找到的关于它的东西,我仍然有同样的问题。如果我停止容器,那也没关系,因为一旦容器停止,线程就死了。但是,因为我不是停止容器,只是停止应用程序,砰内存泄漏 这是非常令人沮丧的,您可能会认为Apa

我在互联网上搜索了一天多,似乎仍然找不到有效的解决方案。我在Tomcat 6.0.32中使用MySQL连接器/J 5.1.35和Tomcat JDBC连接池,如果没有Tomcat JDBC cleaner池线程无法停止并导致内存泄漏,我无法启动/停止/重新加载现有的Web应用程序。我已经尝试了所有我能在网上找到的关于它的东西,我仍然有同样的问题。如果我停止容器,那也没关系,因为一旦容器停止,线程就死了。但是,因为我不是停止容器,只是停止应用程序,砰内存泄漏

这是非常令人沮丧的,您可能会认为Apache对此有详细的解决方案,但他们没有

有人知道如何一劳永逸地解决这个问题吗

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

更新:


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

您的JDBC驱动程序应该在$CATALINA_HOME/lib中,您的数据库连接池应该在server.xml文件中使用
标记进行配置。然后,webapp的context.xml文件应使用
标记链接到全局数据源

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

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


仅供参考:取消注册驱动程序不会释放任何资源,例如打开的连接、语句和结果集。它只是阻止创建新的连接。

好的,发现这与JDBC(face palm)没有任何关系。原来这是一个RMI问题,所以我现在将把这个问题作为一个新问题重新发布


感谢大家抽出时间。

使用连接池HikariCPI刚刚做到了这一点,但仍然存在同样的问题-Tomcat Manager内存泄漏,并且在停止/启动/重新加载应用程序时仍显示此错误:
2015年9月22日9:30:47 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads严重:web应用程序[/test]似乎已启动名为[[Pool Cleaner]:Tomcat连接池[1-4814818]]的线程,但未能停止该线程。这很可能会造成内存泄漏。
听起来您的Web应用程序正在启动该线程,而不是Tomcat。由于我从未明确启动过该线程,它是如何启动的?