C3P0连接池在Tomcat服务关闭时报多个线程无法停止的问题

报错如下

have started a thread named [C3P0PooledConnectionPoolManager[identityToken>2t2zdcaa1uktyjzmc8eoh|4adbdb4b]-HelperThread-#2] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.lang.Object.wait(Native Method)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:683)

在这里插入图片描述

解决:

一.在数据源配置中增加 destroy-method=“close” 配置。

如图
在这里插入图片描述

二.配置个监听器

在这里插入图片描述

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.utils.MyContextListener</listener-class>
    </listener>

完结,重启服务器试试

猜你喜欢

转载自blog.csdn.net/qq_44758515/article/details/106976992
今日推荐