记录问题:严重: Web应用程序注册了JDBC驱动程序 [com.mysql.cj.jdbc.Driver],但在Web应用程序停止时无法注销它

设置一个监听类在servlet注销的时候实现ServletContextListener中的contextDestroyed方法

具体代码如下

package com.demo.myssm.myspringmvc;

import com.mysql.cj.jdbc.AbandonedConnectionCleanupThread;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Enumeration;

/**
 * JDBC监听类
 */
@WebListener
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");
        Enumeration<Driver> drivers = DriverManager.getDrivers();
        Driver d = null;
        try {
            while(DriverManager.getDrivers().hasMoreElements()) {
                d=DriverManager.getDrivers().nextElement();
                DriverManager.deregisterDriver(d);
                System.out.println(" 消除数据库连接驱动 --> : Driver "+d+" deregistered");
            }
        } catch (SQLException ex) {
            System.out.println("Error: deregister driver "+d+" exceptionName:"+ex.getClass().getName()+" detail:"+ex.getMessage());
        }finally {
            System.out.println("jdbc Driver close");
            AbandonedConnectionCleanupThread.uncheckedShutdown();
            System.out.println("clean thread success");
        }
    }
}

这里需要注意的是AbandonedConnectionCleanupThread.uncheckedShutdown();这行代码的mysql版本是8.0系列

如果是mysql5.0系列的数据库应该直接调用shutdown方法,则代码行应为AbandonedConnectionCleanupThread.shuthutdown();

猜你喜欢

转载自blog.csdn.net/m0_62945506/article/details/122021226