項目啓動報錯:
嚴重: The web application [/codeMarket] 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.
2012-2-9 17:43:12 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
嚴重: The web application [/codeMarket] registered the JBDC driver [oracle.jdbc.OracleDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
煩死人了,一開始以爲是c3p0的問題,可是換了druid還是不行,後來就直接把報錯信息貼網上搜索,發現是web應用程序註冊了JBDC驅動程序。oracle.jdbc.driver.OracleDriver但是,當web應用程序停止時,未能註銷它。爲了防止內存泄漏,JDBC驅動程序被迫取消註冊。這樣就會導致無法獲取數據庫連接,
從版本6.0.24開始,Tomcat提供了一個內存泄漏檢測功能,當webapp的/ WEB-INF / lib
中有一個兼容JDBC 4.0的驅動程序,它會在webapp啓動時auto-register自己使用的ServiceLoader
API,但在webapp關閉期間沒有自動註銷。這個消息純屬非正式的,Tomcat已經相應地採取了內存泄漏預防行動。
可以採取以下措施:
忽略這些警告。 Tomcat正在做正確的工作。 實際的bug是在別人的代碼中(所討論的JDBC驅動程序),而不是在你的代碼中。 Tomcat在正常工作,並等待JDBC驅動程序供應商解決問題,以便升級驅動程序
<!– Prevent memory leaks due to use of particular java/javax APIs–>
<!– <Listener className=”org.apache.catalina.core.JreMemoryLeakPreventionListener”/>;–>(本人使用這個方式)
另一方面,您不應該在webapp的/ WEB-INF / lib
中放置JDBC驅動程序,而只能在服務器的/ lib
中放置JDBC驅動程序。 如果你仍然保存在webapp的/ WEB-INF / lib
中,那麼你應該使用ServletContextListener
手動註冊和註銷它。
降級到Tomcat 6.0.23或更低版本,這樣你就不會被那些警告所困擾。但它會悄悄地泄漏內存。這些內存泄漏是Tomcat的OutOfMemoryError
問題背後的主要原因之一。
將JDBC驅動程序移動到Tomcat/lib
文件夾,並有一個連接池數據源來管理驅動程序。請注意,Tomcat的內置DBCP在關閉時不會正確註銷驅動程序。另請參閱作爲WONTFIX關閉的bug DBCP-322。您可以將DBCP替換爲另一個更好的DBCP連接池。例如HikariCP,BoneCP,或Tomcat JDBC池。
解決方式比較粗暴,不知道會不會有其他的問題....