报错信息:
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>
最后正常运行即可
版权属于:张子
本文链接:https://www.znzzi.com/articles/99
所有原创文章采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。 您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。