Web 应用程序 [] 似乎启动了一个名为 [废弃连接清理线程] com.mysql.jdbc.AbandonedConnectionCleanupThread 的线程

问题描述 投票:0回答:4

在我的 Web 开发过程中,我刚刚在 Eclipse IDE 中关闭了我的 Web 应用程序,大约一分钟,我刚刚在 Eclipse 控制台中看到了一个警告

WARNING: The web application [/Spring.MVC] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
Sep 06, 2014 8:31:55 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
WARNING: The web application [/Spring.MVC] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 java.lang.Object.wait(Native Method)
 java.lang.ref.ReferenceQueue.remove(Unknown Source)
 com.mysql.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:40)
Sep 06, 2014 8:32:00 PM org.apache.catalina.core.ApplicationContext log
INFO: No Spring WebApplicationInitializer types detected on classpath
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Sep 06, 2014 8:32:00 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring root WebApplicationContext
Sep 06, 2014 8:32:03 PM org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation
INFO: HHH000204: Processing PersistenceUnitInfo [
    name: personPU
    ...]

到目前为止,它没有造成任何内存泄漏,我检查了我的VisualVM,一切都正常工作,但是当我更多地搜索这件事时,我意识到这个警告是由MySQL驱动程序没有释放资源或没有正确关闭引起的(我不知道该怎么准确地说)我最终在这篇文章中找到了SO相关问题

OP是对的“别担心”的答案是不够的。这个警告让我很困扰,因为它可能会给我带来一些“未来的持久性问题”,这让我很担心,我尝试了OP编写的代码,但我遇到了一个问题“我应该使用什么库”来使该代码工作。这就是我到目前为止所得到的.. import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Enumeration; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; import org.hibernate.annotations.common.util.impl.LoggerFactory; import com.mysql.jdbc.AbandonedConnectionCleanupThread; @WebListener public class ContextFinalizer implements ServletContextListener { private static final Logger LOGGER = LoggerFactory.getLogger(ContextFinalizer.class); public void contextInitialized(ServletContextEvent sce) { } public void contextDestroyed(ServletContextEvent sce) { Enumeration<Driver> drivers = DriverManager.getDrivers(); Driver d = null; while (drivers.hasMoreElements()) { try { d = drivers.nextElement(); DriverManager.deregisterDriver(d); LOGGER.warn(String.format("Driver %s deregistered", d)); } catch (SQLException ex) { LOGGER.warn(String.format("Error deregistering driver %s", d), ex); } } try { AbandonedConnectionCleanupThread.shutdown(); } catch (InterruptedException e) { logger.warn("SEVERE problem cleaning up: " + e.getMessage()); e.printStackTrace(); } } } 我只是想知道我需要什么库,或者如果我使用正确的库来正确实现这一点,我什至不知道我应该使用什么记录器,谢谢您的帮助,


请参阅

此答案
mysql spring jdbc memory-leaks
4个回答
32
投票

如果您使用 Maven,请标记所提供的依赖项。

更新:

根本原因是 Tomcat 在垃圾收集驱动程序时遇到问题,因为它是在多个应用程序共用的单例中注册的。关闭一个应用程序不允许 Tomcat 释放驱动程序。请参阅此

答案



对我来说,我停止mysql(service mysql start),然后我停止bin文件夹中的tomcat(./shutdown.sh),问题就解决了。


1
投票

systemctl 状态 tomcat10.service


0
投票

PS。我使用的是 Debian 操作系统、MariaDb 和 Tomcat10。 希望这可以帮助你。

这对我有用


-4
投票

从邮递员发送DELETE请求到以下端点并重新启动您的应用程序。

{$TOMCAT]/lib

© www.soinside.com 2019 - 2024. All rights reserved.