web应用程序[]似乎启动了一个名为[已放弃的连接清理线程]com.mysql.jdbc. rejonedconnectioncleanupthread的线程

时间:2022-08-26 20:24:48

In the middle of my web-development I just close my web-app in my eclipse IDE, about a minute, I just saw a WARNING in my eclipse console.

在我的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
    ...]

It did not caused any memory leak so far, I checked my VisualVM, everything is working as usual, but as I search more about this thing I realize that this warning is caused by the MySQL driver not releasing resources or not being closed properly(I dont know how to say it exactly) and I ended up in this post at SO related issue

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

and the OP is right the answer of "don't worry about it" won't be sufficient. This warning bothers me because it may give me some future persistence problems and that worries me a lot, I tried the code the OP has written but I'm having a problem what Libraries should I use to make this code work. This is what I got sor far..

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();
    }
  }
}

I just want to know what Libraries do I need or If I'm using the right libraries to implement this properly, I do not even know what Logger should I use, thank you for any help,

我只是想知道我需要什么库或者如果我使用正确的库来正确地实现这个,我甚至不知道我应该使用什么日志记录器,谢谢你的帮助,

1 个解决方案

#1


23  

See this answer. It seems that MySQL driver should be in {$TOMCAT]/lib shared between applications. Check that you are not including it with each application. At least it worked for me and I have been able to remove the warning.

看到这个答案。看起来MySQL驱动程序应该在应用程序之间共享{$TOMCAT]/lib。检查是否没有在每个应用程序中包含它。至少,它对我起了作用,我也消除了这个警告。

If you are using Maven mark the dependency as provided.

如果您正在使用Maven,请按照提供的方式标记依赖项。


UPDATE:
root cause is that Tomcat have problems to garbage collect the driver because it is registered in a singleton common to several applications. Closing one application does not allow Tomcat to release the driver. See this answer.

更新:根本原因是Tomcat在垃圾收集驱动程序时存在问题,因为它是在几个应用程序共同的单例中注册的。关闭一个应用程序不允许Tomcat释放驱动程序。看到这个答案。

#1


23  

See this answer. It seems that MySQL driver should be in {$TOMCAT]/lib shared between applications. Check that you are not including it with each application. At least it worked for me and I have been able to remove the warning.

看到这个答案。看起来MySQL驱动程序应该在应用程序之间共享{$TOMCAT]/lib。检查是否没有在每个应用程序中包含它。至少,它对我起了作用,我也消除了这个警告。

If you are using Maven mark the dependency as provided.

如果您正在使用Maven,请按照提供的方式标记依赖项。


UPDATE:
root cause is that Tomcat have problems to garbage collect the driver because it is registered in a singleton common to several applications. Closing one application does not allow Tomcat to release the driver. See this answer.

更新:根本原因是Tomcat在垃圾收集驱动程序时存在问题,因为它是在几个应用程序共同的单例中注册的。关闭一个应用程序不允许Tomcat释放驱动程序。看到这个答案。