簡體   English   中英

Tomcat jdbc 連接池 - Pool-Cleaner 內存泄漏

[英]Tomcat jdbc connection pool - Pool-Cleaner Memory Leak

我已經在互聯網上搜索了一天多,但似乎仍然找不到可行的解決方案。 我正在使用 MySQL Connector/J 5.1.35 和 Tomcat JDBC Connection Pool with Tomcat 6.0.32,我無法啟動/停止/重新加載現有的 Web 應用程序,而沒有 tomcat jdbc 清潔器池線程無法停止並導致內存泄漏。 我已經嘗試了所有可以在網上找到的有關它的方法,但仍然遇到相同的問題。 如果我停止容器,那沒關系,因為一旦容器停止,線程就死了。 但是,因為我沒有停止容器,只是停止應用程序,BAM! - 內存泄漏。

這非常令人沮喪,您會認為 Apache 會為此提供詳細的解決方案,但他們沒有。

有誰知道如何一勞永逸地解決這個問題?

哦,是的 - 我取消注冊驅動程序並在 ServletContextListener 中運行 AbandonedConnectionCleanupThread.shutdown() 並嘗試在 $CATALINA_HOME/lib 和 WEB-INF/lib 中部署驅動程序,但仍然有同樣的問題。

更新:

看起來連接池可能不是問題。 如果我使用 DBCP,我不會收到關於內存泄漏的錯誤,但是如果我在管理器頁面上運行“查找泄漏”,Tomcat 肯定會發現應用程序中的泄漏 - 只是從啟動它,運行從數據庫讀取的操作,然后停止它。 如果我只是啟動/停止它,則不會報告任何問題。 我已確保所有連接/語句/結果集都已正確關閉。 如果我切換回 Tomcat JDBC,我仍然有同樣的問題,它只是在停止/重新啟動應用程序期間報告(至少據我所知),因為 [Pool-Cleaner] 線程無法停止,單擊“查找泄漏”按鈕時管理器發現泄漏。

您的 JDBC 驅動程序應該在 $CATALINA_HOME/lib 中,並且您的數據庫連接池應該在 server.xml 文件中使用<Resource>標簽進行配置。 然后,您的 web 應用程序的上下文.xml 文件應鏈接到具有<ResourceLink>標記的全局數據源。

這種方式連接是全局的,並由連接到同一數據庫的所有 web 應用程序共享。 當 webapp 停止或重新啟動時,連接不會被釋放,因為它們不屬於 webapp,它們屬於 Tomcat。

沒有數據庫連接內存泄漏,假設您的所有 webapp servlet/處理程序在 finally 塊中正確清理它們的資源。

僅供參考:取消注冊驅動程序不會釋放任何資源,例如打開的連接、語句和結果集。 它只是防止創建新連接。

好的,發現這根本與 JDBC (face-palm) 無關。 原來這是一個 RMI 問題,所以我現在將這個問題作為一個新問題重新發布。

感謝大家的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM