Tomcat停止时为了防止内存泄漏,JDBC驱动程序被强制取消注册出现原因
1、问题记录
首先是启动项目tomcat碰到了这个问题
严重: The web application [/cctcloud] registered the JDBC driver [com.alibaba.druid.proxy.DruidDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
中文错误就是
严重:web应用程序[/cctcloud]注册了JDBC驱动程序[网址:com.alibaba.druid.proxy.DruidDriver]但在web应用程序停止时未能注销它。为了防止内存泄漏,JDBC驱动程序已被强制注销。
2、错误原因
由于idea没有将修改后的jar发布出去
3、解决方法
方法一:手动配置监听器,用来在Tomcat关闭时取消注册JDBC驱动程序,并将线程停止
①编写自定义监听器
package com.ssm.util; import com.mysql.cj.jdbc.AbandonedConnectionCleanupThread; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import java.sql.DriverManager; import java.sql.SQLException; 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(); } } }
②在web.xml中注册监听器
<listener> <listener-class>com.ssm.util.MyContextListener</listener-class> </listener>
方法二:
Ctrl+Alt+Shift+S弹出Project Structure窗口,在Artifacts选项到Output Layout标签中找到Available Elements,
右键点击Put into Output Root,执行后,在WEB-INF会增加lib目录,里面是项目引用的jar包,点击OK。再次部署应用就能成功运行了。
运行结果