1、maven工程重新部署tomcat时出现强制反注册mysql驱动的警告
警告信息:[RMI TCP Connection(9)-127.0.0.1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [ROOT] 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. 警告的大概意思就是重新部署项目时需要对已注册的mysql驱动做注销操作,但没有注销成功,警告可能引起内存泄漏,于是强制注销了驱动。不解决这个警告按说没什么问题,但是看着很不舒服。解决办法:
新建一个监听器类,让其实现ServletContextListener监听器接口,实现其方法,在contextDestroyed(ServletContextEvent event)方法里手动注销驱动即可解决:
public class AppContextListener implements ServletContextListener {
public void contextDestroyed(ServletContextEvent event) {
// 手动反注册mysql驱动
while (DriverManager.getDrivers().hasMoreElements()) {
try {
DriverManager.deregisterDriver(DriverManager.getDrivers().nextElement());
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
2、maven工程重新部署/关闭tomcat时线程未正常关闭
警告信息:[RMI TCP Connection(7)-127.0.0.1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: 意思就是MySQL Statement Cancellation Timer这个线程没有正常关闭,可能会引起内存泄漏,不管它是啥,干掉就对了。解决办法:
首先,这个bug是musql驱动包的问题,在5.1.27之后的驱动版本解决了这个问题,所以建议使用此版本之后的驱动。
我这里用的是5.1.37版本。
解决步骤:
1、首先先把mysql的驱动包找到,放到本地tomcat的lib目录下,名称:mysql-connector-java-5.1.37-bin.jar。最后的"-bin"最好加上,我试了不加"-bin"的时候还是会出问题,所以还是加上。
2、在实现ServletContextListener接口的AppContextListener监听器的contextDestroyed方法内调用mysql驱动包AbandonedConnectionCleanupThread类内的方法,手动关闭线程:
// 关闭弃用的线程
try {
AbandonedConnectionCleanupThread.shutdown();
} catch (InterruptedException e) {
e.printStackTrace();
}
先前使用5.1.6版本的mysql驱动,jar包内是没有这个方法的,所以也没办法解决这个问题,更高的版本如5.1.48、8.x的方法略有不同AbandonedConnectionCleanupThread.checkedShutdown();方法内多加了一层检查,效果相同。
来源:CSDN
作者:鬼火123
链接:https://blog.csdn.net/weixin_43584430/article/details/103459826