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。再次部署应用就能成功运行了。

    

 

     运行结果

    

 

posted @ 2022-03-24 13:32  CGGirl  阅读(7419)  评论(0编辑  收藏  举报