SSM框架maven工程重新部署项目/关闭tomcat时,出现的反注册驱动以及线程未正常关闭的警告解决(C3P0连接池)

情到浓时终转凉″ 提交于 2019-12-09 17:39:13

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();方法内多加了一层检查,效果相同。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!