遇到"To prevent a memory leak, the JDBC Driver has been forcibly unregistered." 后

2014-3-20 14:20:55 org.apache.catalina.core.StandardContext reload
信息: Reloading this Context has started
2014-03-20 14:20:55,531 [org.springframework.web.context.support.XmlWebApplicationContext]-[INFO] Closing WebApplicationContext for namespace 'mvc-dispatcher-servlet': startup date [Thu Mar 20 11:29:19 CST 2014]; root of context hierarchy
14:20:55.531 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] INFO  com.jolbox.bonecp.BoneCP - Shutting down connection pool...
14:20:55.531 [BoneCP-pool-watch-thread] DEBUG com.jolbox.bonecp.PoolWatchThread - Terminating pool watch thread
14:20:55.531 [BoneCP-pool-watch-thread] DEBUG com.jolbox.bonecp.PoolWatchThread - Terminating pool watch thread
14:20:55.531 [BoneCP-pool-watch-thread] DEBUG com.jolbox.bonecp.PoolWatchThread - Terminating pool watch thread
14:20:55.531 [BoneCP-pool-watch-thread] DEBUG com.jolbox.bonecp.PoolWatchThread - Terminating pool watch thread
2014-3-20 14:20:55 org.apache.catalina.core.ApplicationContext log
信息: Destroying Spring FrameworkServlet 'mvc-dispatcher'
14:20:55.546 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] INFO  com.jolbox.bonecp.BoneCP - Connection pool has been shutdown.
14:20:55.546 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] DEBUG com.jolbox.bonecp.BoneCPDataSource - Connection pool has been shut down
2014-3-20 14:20:56 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
严重: The web application [/callcenter] 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.
2014-3-20 14:20:56 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
严重: The web application [/callcenter] 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.
2014-3-20 14:20:56 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
严重: The web application [/callcenter] appears to have started a thread named [Timer-0] but has failed to stop it. This is very likely to create a memory leak.


最近,在eclipse调试系统时,经常会出现以上异常。

出现条件:web应用,使用spring,连接池用的bonecp。当修改一点代码,save后,spring会重新加载,然后问题就出现了。


在网上查看资料后,找到了该报告:https://issues.apache.org/jira/browse/DBCP-332 

原文引用:

BasicDataSource's method close() doesn't deregister JDBC driver. This causes permgen memory leaks in web server environments, during context reloads. For example, using Tomcat 6.0.26 with Spring, and BasicDataSource declared in Spring context, there is a message printed at web application reload:

SEVERE: A web application registered the JBDC 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.


翻译:

BasicDataSource中的close方法没有注销(deregister)jdbc驱动。在web server环境中,当reload content时,就引起了堆内存泄露(permgen memory leaks)。例如,当在使用spring和tomcat  6.0.26时,BasicDataSource在Spring context被声明了,这样就会有一条信息在web application reload的时候: SEVERE: A web application registered the JBDC 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.


该地址中 https://issues.apache.org/jira/browse/DBCP-332 提供了一种解决方案。


我并没有使用该方案,因为使用的是bonecp,所以我看了下bonecp的BoneCPDataSource的close方法,发现,其中有个BoneCPConfig类,其中有这个属性:deregisterDriverOnClose。 于是我在spring的xml配置中,加入了该配置。


成功了!!!

再次修改代码,保存时,spring重新加载,成功了,没有异常,但是多打印了一行,大家可以看到:

14:54:52.000 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] INFO  com.jolbox.bonecp.BoneCP - Unregistering JDBC driver for : jdbc:mysql://xxx.xxx.xxx.xxx:3306/ccdb?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true

全日志如下:

14:54:51.984 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] INFO  com.jolbox.bonecp.BoneCP - Shutting down connection pool...
14:54:52.000 [BoneCP-pool-watch-thread] DEBUG com.jolbox.bonecp.PoolWatchThread - Terminating pool watch thread
14:54:52.000 [BoneCP-pool-watch-thread] DEBUG com.jolbox.bonecp.PoolWatchThread - Terminating pool watch thread
14:54:52.000 [BoneCP-pool-watch-thread] DEBUG com.jolbox.bonecp.PoolWatchThread - Terminating pool watch thread
14:54:52.000 [BoneCP-pool-watch-thread] DEBUG com.jolbox.bonecp.PoolWatchThread - Terminating pool watch thread
14:54:52.000 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] INFO  com.jolbox.bonecp.BoneCP - Unregistering JDBC driver for : jdbc:mysql://xxx.xxx.xxx.xxx:3306/ccdb?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
14:54:52.000 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] INFO  com.jolbox.bonecp.BoneCP - Connection pool has been shutdown.
2014-3-20 14:54:52 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
严重: The web application [/callcenter] 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.
2014-3-20 14:54:52 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
严重: The web application [/callcenter] appears to have started a thread named [Timer-0] but has failed to stop it. This is very likely to create a memory leak.




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、付费专栏及课程。

余额充值