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

    

 

     運行結果

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM