报错信息如下:
D:\apache-tomcat-8.5.78-x64\apache-tomcat-8.5.78\bin\catalina.bat stop
Using CATALINA_BASE: "C:\Users\ZhangHewen\AppData\Local\JetBrains\IntelliJIdea2021.3\tomcat\880fddfa-af57-48e3-b0c6-e5e4a85303d1"
Using CATALINA_HOME: "D:\apache-tomcat-8.5.78-x64\apache-tomcat-8.5.78"
Using CATALINA_TMPDIR: "D:\apache-tomcat-8.5.78-x64\apache-tomcat-8.5.78\temp"
Using JRE_HOME: "C:\Program Files\Java\jdk1.8.0_201"
Using CLASSPATH: "D:\apache-tomcat-8.5.78-x64\apache-tomcat-8.5.78\bin\bootstrap.jar;D:\apache-tomcat-8.5.78-x64\apache-tomcat-8.5.78\bin\tomcat-juli.jar"
Using CATALINA_OPTS: ""
27-Jun-2022 18:50:47.738 信息 [main] org.apache.catalina.core.StandardServer.await 通过关闭端口接收到有效的关闭命令。正在停止服务器实例。
27-Jun-2022 18:50:47.738 信息 [main] org.apache.coyote.AbstractProtocol.pause 暂停ProtocolHandler["http-nio-8080"]
27-Jun-2022 18:50:48.129 信息 [main] org.apache.catalina.core.StandardService.stopInternal 正在停止服务[Catalina]
18:50:48 DEBUG [localhost-startStop-2] o.s.w.c.s.XmlWebApplicationContext - Closing WebApplicationContext for namespace 'springmvc-servlet', started on Mon Jun 27 18:50:26 CST 2022
18:50:48 INFO [localhost-startStop-2] c.alibaba.druid.pool.DruidDataSource - {dataSource-1} closing ...
18:50:48 INFO [localhost-startStop-2] c.alibaba.druid.pool.DruidDataSource - {dataSource-1} closed
27-Jun-2022 18:50:48.170 警告 [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc Web应用程序 [ROOT] 注册了JDBC驱动程序 [com.alibaba.druid.proxy.DruidDriver],但在Web应用程序停止时无法注销它。 为防止内存泄漏,JDBC驱动程序已被强制取消注册。
27-Jun-2022 18:50:48.170 警告 [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc Web应用程序 [ROOT] 注册了JDBC驱动程序 [com.mysql.cj.jdbc.Driver],但在Web应用程序停止时无法注销它。 为防止内存泄漏,JDBC驱动程序已被强制取消注册。
27-Jun-2022 18:50:48.170 警告 [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[ROOT]似乎启动了一个名为[Abandoned connection cleanup thread]的线程,但未能停止它。这很可能会造成内存泄漏。线程的堆栈跟踪:[
java.lang.Object.wait(Native Method)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:70)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
java.lang.Thread.run(Thread.java:748)]
27-Jun-2022 18:50:48.185 信息 [main] org.apache.coyote.AbstractProtocol.stop 正在停止ProtocolHandler ["http-nio-8080"]
27-Jun-2022 18:50:48.201 信息 [main] org.apache.coyote.AbstractProtocol.destroy 正在摧毁协议处理器 ["http-nio-8080"]
已与服务器断开连接
解决办法:
手动配置监听器,用来在Tomcat关闭时取消注册JDBC驱动程序,并将线程停止。
1.编写自定义监听侦
package com.zhang.reader.tools;
import com.mysql.cj.jdbc.AbandonedConnectionCleanupThread;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* @author : []
* @version : [v1.0]
* @className : ContextFinalizer
* @description : [解决tomcat服务器关闭时无法停止JDBC驱动程序和连接池线程疑似内存溢出警告;在web.xml中注册监听侦]
* @createTime : [2022/6/27 21:38]
*/
public class MyContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("webService start");
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("webService stop");
try {
while(DriverManager.getDrivers().hasMoreElements()) {
DriverManager.deregisterDriver(DriverManager.getDrivers().nextElement());
}
System.out.println("jdbc Driver close");
AbandonedConnectionCleanupThread.checkedShutdown();
System.out.println("clean thread success");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
2.在web.xml中追加注册监听侦
<listener>
<!-- 解决tomcat服务器关闭时无法停止JDBC驱动程序和连接池线程疑似内存溢出警告-->
<listener-class>com.zhang.reader.tools.MyContextListener</listener-class>
</listener>
3.在配置文件的数据源中加入销毁办法
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" >