The JDBC Driver has been forcibly unregistered

问题描述:

警告 [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [XXXX] registered the JDBC driver [com.mysql.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.


翻译过来的意思就是,JDBC没有注销,导致内存泄露,所以被系统强制注销了。


漫漫Debug长路:


1、网上说:“在服务器保持运行的状态中,redeploy这个项目, 就出现了异常,要stop之后 再redeploy,就可以了

所以我就在任务管理器里面把tomcat kill掉了,然后再运行。

>>结果就是,依然报错。


2、网上说:“是tomcat的版本问题,tomcat新检测机制导致的这个问题,换版本可以解决问题,换到6以下的版本

所以我就换了版本,但是很可惜,tomcat现在能下载的最低的版本就是6.0.48。 

>>结果就是,依然报错。


3、网上说:“把Tomcat的内存增加一下

所以我去把tomcat的内存从256M调至1024M(我的最大)

>>结果就是,依然报错。


4、网上说:“在tomcat的server.xml文件中,把<!-- Prevent memory leaks due to use of particular java/javax APIs-->
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>;这个监听给关了。

我知道这个方法治标不治本,但是我真的去关了。

>>结果就是,关了一个JreMemoryLeakPreventionListener没用,报错。索性把它附近的全部listener都关闭了。 呵呵,还是报错。


【这个时候有点儿崩溃了,挺住,继续,坚持!!】


5、网上说:“可能是jar包的问题,把JDBC的jar包放到lib下面,把app的jar包删除”

>>我做了,没用。


【很崩溃,怎么做都不对,服务器低配又卡的一死一死的,而且已经深夜11点了,心情非常沮丧】


然后我就打开程序媛群,把错误信息发给她们,问问她们有没有遇到过。

女神给我的回复是:“内存泄露,得治本。”


所以我就开始了漫漫走读代码的过程。

我发现我的数据库用了好像确实没关? 所以我在函数里写了connetion.close()

>>当然这就是导致我后面程序能运行但是出错的根源,不能乱关!没用完别急着关!


然后我发现我的注册函数 load ,里面用了一个 destory()方法,但是我没有覆写它。

所以我就:

public void destroy() {
		super.destroy(); 	
		    try{
		        DriverManager.deregisterDriver(DriverManager.getDrivers().nextElement());
		    }catch(Exception e){
		        e.printStackTrace();
		    }
		}

这个是从:http://hongjiang.info/tomcat-jdbc-leak-prevention/这个帖子里得到的启发。

对JDBC Driver的清理,是clearReferencesJdbc方法,它检查当前WebappClassLoader加载过的,在关闭时未注销掉的JDBC Driver,给出警告信息,并强行将这些Driver反注册掉。

销毁时未将这个Driver给反注册掉;这时不管是显式的通过命令来stop tomcat,还是因为设置了自动reload,而且恰好检查到应用有变,执行了reload的时候(reload也是对app context进行stop,然后再重新start),就会被tomcat判断为泄露,给出警告并强制反注册Driver

要避免这个信息,应用或框架应该自己来保证在销毁时将JDBC Driver反注册掉。


最后,感谢,成功了哭


  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
12-Jul-2023 18:36:28.896 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.startInternal One or more listeners failed to start. Full details will be found in the appropriate container log file 12-Jul-2023 18:36:28.898 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.startInternal Context [/setting] startup failed due to previous errors 2023-07-12 18:36:28,899 [// - - ] INFO org.springframework.web.context.support.XmlWebApplicationContext - Closing Root WebApplicationContext: startup date [Wed Jul 12 18:36:27 CST 2023]; root of context hierarchy 2023-07-12 18:36:28,900 [// - - ] INFO org.springframework.cache.ehcache.EhCacheManagerFactoryBean - Shutting down EhCache CacheManager 12-Jul-2023 18:36:28.908 WARNING [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [setting] registered the JDBC driver [com.mysql.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. 12-Jul-2023 18:36:28.908 WARNING [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [setting] appears to have started a thread named [Abandoned connection cleanup thread] 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) java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143) com.mysql.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:40)
07-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值