2009-07-16 67 views
3

我在Java中實現了一個連接池(即一個java.sql.Connection的池)。我應該何時檢查連接是否仍然有效?在我借給他們之前,我不想這樣做。我應該這樣做,當他們返回?每次?有一個聰明的方式來安排檢查?您何時驗證連接池中的連接?

回答

0

這是否會受到連接池繁忙和充分利用的影響?我猜這兩個約束條件應滿足 -

  1. 難道沒有提供一個無效的連接對象的客戶
  2. 不要採取大量的時間,提供一個連接(即不啓動,當他們建立連接在你的門口要求借一張)。

因此,一些熱切的措施是好的,如果您的使用模式說頻繁的設置和拆卸(從客戶的角度來看),您將需要有一個渴望的算法。

當然,您可以錨定的兩個事件是1)新連接請求2)關閉連接請求。

新的連接請求 - 檢查有效性(可能是多餘的)。如果池已被完全使用或超出閾值,則將新連接提供到池中(即如果需要,則展開)。

關閉連接請求 - 檢查關閉的連接是否有效,如果需要補充池。

您的算法可能會比以上更加渴望,當然這取決於您的具體需求。

0

答案只有在得到一些關於將使用多少連接以及您的系統可以處理多少的指標後才能給出答案。

有了這些指標,您可以決定什麼是檢查和嘗試釋放一些資源的最佳時間。

3

我認爲你的問題的答案取決於你想把多少努力放入你的連接池。

簡單的方法是做你不想做的事,即在請求時檢查連接,我期望因爲你不想在創建新連接時延遲請求線程。

您可以有一個後臺線程來測試連接並根據需要重新創建它們。 我認爲你應該在返回之前總是測試,如果它已經死了,那麼再從池中取出另一個,並安排一個新的連接來替換它。

我想你編寫自己的一個很好的理由,因爲你可以像使用 雅加達DBCP & C3P0許多非常優秀的開源庫,還有更多

肖恩

+0

+1爲'爲什麼在這個世界上你想要自己做'這個問題。至少,從一個開源項目開始,並根據需要進行調整。 – 2009-07-17 04:00:42

1

有一個監視線程這可以確保在沒有被使用的情況下池中的X秒之後,會發出一個虛擬請求(心跳),如「從雙選擇1」與oracle。這應該讓他們活着。

0

連接可能隨時「變質」。因此,無論何時檢查連接,即使在從池中分發前檢查連接,總會有用戶嘗試使用不良連接的可能性。

我工作的連接池項目選擇通過不處理它來處理這種不確定性。他們假設池中的連接是好的,除非他們有其他具體的證據,這意味着某種異常從連接用戶流回。

可以知道某些類型的錯誤和異常意味着池中的每個連接現在都已失效。

我見過一些特殊情況下的環境,這種方法並不理想。在這些情況下,可以使用其他解決方案。例如,也許你正在編程的服務器是連接池,每天凌晨2點重新啓動。在這種情況下,定時器可以在服務器重新啓動後每天運行一次(也許在凌晨3點),測試&可能會使池中的所有連接都失效。

但是,我會建議您讓每個特殊情況指定解決方案,因爲它是必需的。