簡體   English   中英

JDBC連接池內存問題(Java EE應用程序)

[英]JDBC Connection Pool Memory Issues (Java EE Application)

我目前有一個Java EE應用程序,其中實現了自己的連接池類。 我使用的每種方法都會執行一個簡單的查詢(Statement和ResultSet)。 在每個使用JDBC /我的池的方法的最后一個塊中,我首先關閉ResultSet,然后關閉Statement,因為書和在線中提到的許多資源都應完成。 最后,我將連接返回到池中。

在查看JVM的內存時,我注意到在通過連接池進行使用JDBC的調用之后,內存從未真正釋放,或者這樣做花費了很長時間。 我檢查了我的垃圾收集設置,並且正在使用gencon(IBM WebSphere),在線上的許多資源也表明它非常好。 我也在應用程序中使用Spring Framework。

我編寫的連接池類非常簡單。 初始化后,它將創建與數據庫的一定數量的連接,並將它們添加到隊列中(我嘗試了另一個實現,該實現僅帶有一個簡單的Vector,但與內存的結果相同)。 當您請求連接時,它將檢查以確保存在可用的連接,如果存在,則將其提供給呼叫者。 最后,您將其返回,並將其放回隊列/向量中。

我想知道是否還有其他方法可以解決? 我應該讓Spring Framework代替我處理連接池,還是有其他東西可以更好地處理內存? 對我來說,這確實有意義,但是我對實現連接池不太熟悉。 所有資源都說可以做我正在做的事情,但是我假設他們可能正在使用一些內置的池實現。 我確實知道關閉連接有效,但是由於這是一個自定義的池解決方案,因此我無法真正做到這一點。

謝謝!

您的應用程序是否在WebSphere Application Server內運行? 它是從應用服務器獲取數據源,而不是自己創建數據源嗎? 如果是這樣,則連接和語句已經被池化了,您不需要自己池化它們。

好,首先是第一件事:除非您有充分的理由,否則實現自己的連接池機制是一種不必要的風險練習。 有很多連接池機制可供選擇-Spring是其中之一,雅加達的DBCP是另一種。 如果您可以選擇使用第三方實用程序進行連接池-請執行此操作。 如果您在容器中運行,請讓容器為您完成工作(WebSphere已經通過其各種“幫助程序類”完成了此工作)。

關於您遇到的症狀:內存未釋放這一事實並不意味着存在內存泄漏。 由JVM決定是否以及何時真正釋放未引用的對象實例。 您是否也遇到OutOfMemory錯誤?

首先發出一些堆轉儲(在釋放JDBC資源之后),以查看那里發生了什么。

關於您編寫​​的代碼-在不發布代碼的情況下,很難估計您那里是否存在隱藏的bug。 但您描述的流程似乎正確。

暫無
暫無

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

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