the JDBC Driver has been forcibly unregistered;tomcat總是memory leak問題 ,爲了防止內存泄漏,jdbc驅動程序已強制取消註冊

項目啓動報錯:

嚴重: 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自己使用的ServiceLoaderAPI,但在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連接池。例如HikariCPBoneCP,或Tomcat JDBC池

解決方式比較粗暴,不知道會不會有其他的問題....

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章