4

我正在使用Apache Commons Pool庫來維護一個couchbase連接池(可以看作是任何一種連接,並不重要)。如何通過超時使用Apache公共池返回對象

我現在面臨的問題是,我找到對象返回到池中的唯一途徑是通過調用從GenericObjectPool返回object方法來做到這一點編程。這會強制應用程序保證一旦從對象池中借用對象的返回,而不管應用程序中是否有任何異常或意外行爲。

儘管我在整個應用程序中控制對象返回到池中,但我發現完全依賴程序員返回對象是有風險的。有人知道一旦超過給定的超時時間就會自動返回對象的方法(回收對象)。它也將以任何方式使池創建新的對象,一旦超過借用對象的超時時間。

PS:我的應用程序公開了一組連接到分佈式memcache服務器(Couchbase)的REST Web服務。該池創建一組到Couchbase的連接。

任何建議都會有幫助!

EDIT

我嘗試的第一個解決方案是創建包含從存儲在池(CouchbaseClient)的對象的類型的連接對象的新類(CouchbaseClientHandler)。 我已經實現了完成方法上CouchbaseClientHandler,確保相關聯的實際返回到池中,如果此對象的引用漸漸由一個意外的異常丟失。當垃圾收集器銷燬對象時,該對象將被返回。這沒有按預期工作。無法預測垃圾收集器何時到達回收對象,並且通常需要的時間比期望的要高。

我現在實際工作的解決方案有點不同,但更安全。 由於我的池打算由Web服務使用,並且由於每個Web服務都在單獨的獨特線程(我在Tomcat上使用Jersey)運行,因此我決定使用靜態hashmap變量來映射唯一的線程Id的列表CouchbaseClient在執行web服務時從池中創建的對象。由於我的Web服務的設計方式使得無論發生什麼事情,處理程序方法都會在返回之前處理最終輸出,所以我可以始終運行一個方法,該方法返回池 那些借用的對象(連接),沒有有效地回到游泳池。

雖然這對我來說工作得很好,但我真的很想知道是否有更好的方式來聲明或通過超時借用未返回的對象來擦除。

回答

2

假設銷燬/創建新方法正常,並且您使用的是公共池的2.0+版本,則可以使用廢棄的對象跟蹤和刪除來確保在借用對象並永不返回時容量不會永久泄漏。請參閱用於配置設置的AbandonedConfig的javadoc以及用AbandonedConfig實例作爲參數的GenericObjectPool構造函數。在啓用廢棄對象跟蹤和刪除的情況下,當池的容量不足時,池將銷燬借用的但未返回的實例時間超過removeAbandonedTimeout的實例。

如果由於某些原因您必須使用1.x版本的池,那麼您可以獲取源代碼或直接使用DBCP 1.x附帶的AbandonedObjectPool。