报错信息:

28-Oct-2021 19:48:56.228 警告 [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc Web应用程序 [demo] 注册了JDBC驱动程序 [com.mysql.cj.jdbc.Driver],但在Web应用程序停止时无法注销它。 为防止内存泄漏,JDBC驱动程序已被强制取消注册。

28-Oct-2021 19:48:56.228 警告 [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[demo]似乎启动了一个名为[mysql-cj-abandoned-connection-cleanup]的线程,但未能停止它。这很可能会造成内存泄漏。线程的堆栈跟踪:[
java.base@16.0.1/java.lang.Object.wait(Native Method)
java.base@16.0.1/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:155)
com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:91)

java.base@16.0.1/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
java.base@16.0.1/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
java.base@16.0.1/java.lang.Thread.run(Thread.java:831)]

解决方法:

配置监听器,用来在Tomcat关闭时取消注册JDBC驱动程序,并将线程停止。

  • 编写自定义监听类
package com.demo.db;

/*
 *  @fileName ContextListener.java
 *  @author zhangz1
 *  @date 2021-10-28 19:18
 *  Copyright 2021   All rights reserved.
 */

import com.mysql.cj.jdbc.AbandonedConnectionCleanupThread;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ContextListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        System.out.println("服务器启动");
    }

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        System.out.println("服务器停止");
        try {
            while (DriverManager.getDrivers().hasMoreElements()) {
                DriverManager.deregisterDriver(DriverManager.getDrivers().nextElement());
            }
            System.out.println("JDBC驱动关闭");
            AbandonedConnectionCleanupThread.checkedShutdown();
            System.out.println("清理进程");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}
  • 在web.xml中注册监听器
<listener>
    <listener-class>com.demo.db.ContextListener</listener-class>
</listener>

最后正常运行即可

参考Somber-的文章

最后修改:2023 年 12 月 23 日
点个赞或者请作者喝杯咖啡