2012-09-13 33 views
2

有沒有辦法在設置的超時時間後關閉JDBC連接?這些連接正在GenericObjectPool中創建。我知道該池可以關閉池中的空閒連接,但連接被認爲是活動的又如何呢?我試圖在有人不叫close()的情況下控制連接泄漏。從我讀過的唯一方法可能是在服務器上設置超時時間,但我希望能夠在Java中找到一種方法。謝謝!設置超時期限後關閉JDBC連接?

+11

我會確保您正確關閉您的資源。試圖解決問題可以隱藏更嚴重的問題。 –

+0

您能否詳細說明一下:「如果有人不叫close()」。 – vector

+0

我認爲他意味着程序員忘記了在連接上調用close()。 –

回答

0

我同意彼得勞瑞,我會確保總是關閉連接。但是,如果我還是要確保關閉連接(如果有人從池中把它忘了還吧),我會如下做到這一點:

  1. 裝飾返回的java.sql.Connection中在泳池旁邊。
  2. 在構造函數中創建一個計時器,並將其設置爲配置的持續時間,以允許使用活動連接。
  3. 如果用戶在定時器觸發前調用關閉它,我將取消定時器並將連接返回到池。
  4. 如果計時器在用戶關閉連接之前觸發,我將返回到池的連接並使裝飾連接無效,以便進一步調用將拋出IllegalStateException
+1

只需要提及'Glassfish'中有一個'Leak Timeout'和'Leak Reclaim'連接池的高級設置。如果連接在「泄漏超時」秒後沒有返回到池中,則會自動返回到池(如果啓用了「泄漏回收」)。 –

+0

是的,activeConnectionTimeout已成爲連接存儲器中的Coomon可配置參數。感謝有關glassfish的信息 – Vikdor

+0

謝謝你的想法。我會研究這個。你們是對的,打電話是最好的解決方案。 – user1668814

1

我使用舊的Apache commons池,但我切換到新的Apache Tomcat Pool這實際上有一個功能可以在超時後刪除連接。

removeAbandoned - (布爾值)標記刪除被放棄的連接,如果它們超過removeAbandonedTimout。如果設置爲true,則連接將被視爲放棄並有資格刪除(如果它的使用時間超過removeAbandonedTimeout)將其設置爲true可以恢復未能關閉連接的應用程序的數據庫連接。另請參閱logAbandoned默認值爲false。