01-Jul-2016 10:49:05.875 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [ROOT] 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
出現條件: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配置中,加入了該配置。