• 解决:The web application [] registered the JDBC driver [] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.


    原文地址:https://www.cnblogs.com/imdeveloper/p/12061037.html

    问题描述

    在将Spring Boot程序打包生成的war包部署到Tomcat后,启动Tomcat时总是报错,但是直接在IDEA中启动Application或者用"java -jar"方式运行jar包时都能正常运行。报错信息如下:

    To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
    

    为了防止内存泄漏,已强制注销JDBC驱动程序。

    开发环境

    Spring Boot + MySql + Spring Security + Druid + Mybatis-Plus

    1. Spring Boot版本:2.1.8.RELEASE
    2. mysql-connector-java版本:8.0.18
    3. Druid版本:1.1.20
    4. Tomcat版本:8.X

    解决方法

    概述:保证部署环境和开发环境一致,即独立Tomcat的版本和IDEA中的Tomcat版本保持一致

    为了解决这个问题,我花费了两天时间查找各种资料,但用尽了各种方法都没能解决问题。就在快要绝望的时候,我想到独立的Tomcat会报错,但是IDEA中的Tomcat却可以正常启动,是不是因为两者的版本不同导致的?

    于是开始用以下的方法排查问题:

    1. 在IDEA中启动Application,查看Tomcat版本:(9.0.24)
    2. 查看独立Tomcat版本:(8.5.32)

      可以看到两者的版本号不同,所以我去Tomcat官网下载了版本号为9.0.X的Tomcat,然后将war包部署到webapps中,启动Tomcat。这次没有报错,问题解决!

    附:具体解决思路

    具体错误信息


    错误大致有以下几个:

    1. The web application [] 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.

    2. The web application [] registered the JDBC driver [com.mysql.cj.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

    3. The web application [] appears to have started a thread named [mysql-cj-abandoned-connection-cleanup] but has failed to stop it. This is very likely to create a memory leak.

    所以从字面意义上可以看出,报错原因大致为:

    Web应用程序注册了JBDC驱动程序[com.mysql.cj.jdbc.Driver],但在Web应用程序停止时未能注销它。为了防止内存泄漏,已强制注销JDBC驱动程序。

    网上给出的错误原因是:

    从6.0.24版本开始,Tomcat附带了内存泄漏检测功能,当webapp中存在与JDBC 4.0兼容的驱动程序时,该漏洞又会导致这种警告消息,该驱动程序会在使用API启动webapp的过程/WEB-INF/lib中自动进行注册,但是在webapp关闭期间未自动注销自身。

    网上给出的几种解决方案:(都未能解决我的问题,可能是错误原因不同)

    1. 降级到Tomcat 6.0.23或更早的版本。
    2. 将JDBC驱动程序移至Tomcat的/lib文件夹,并具有连接池数据源来管理驱动程序。
    3. 将Tomcat安装目录中下的server.xml文件中的 标签全部注释掉,并将将reloadable="true"改为 false。
  • 相关阅读:
    CF575A Fibonotci [线段树+矩阵快速幂]
    P3768 简单的数学题 [杜教筛,莫比乌斯反演]
    2-SAT 学习笔记
    CF776D The Door Problem [2sat]
    KD-Tree 学习笔记
    Mybatis入门笔记(2)——基于代理Dao实现CRUD
    Mybatis入门笔记(1)——基于原始dao实现CRUD
    mybatis入门看这一篇就够了
    使用JDBC程序的问题总结
    关于递归你知道多少?
  • 原文地址:https://www.cnblogs.com/imdeveloper/p/12061037.html
Copyright © 2020-2023  润新知