2009-12-17 50 views
2

我一直在尋求在我的應用程序的一部分實現池。我想使用Commons Pool庫,但我很擔心close()行爲如何工作。從查看javadocs和源代碼看,在調用close()方法時,在池中創建的對象是否會被破壞似乎並不清楚。從我所看到的情況來看,只有在游泳池中閒置的物體纔會被破壞 - 任何正在使用但尚未退回的物體都不會被觸及。什麼是Apache Commons Pool close()行爲

我在這裏錯過了什麼嗎?我想確保池關閉時所有對象都被正確銷燬。

任何人以前使用過這個,並有一個關於它如何工作的想法?

+0

哪個'close()'你指的是? – skaffman 2009-12-17 15:46:25

回答

1

一般來說(不管池庫如何),銷燬正在使用的對象是不安全的。這樣做很可能會導致例外。如果你想保證一個乾淨的關閉,那麼你會希望確保所有的對象已經返回到池中。

在所有對象返回到池之前,您是否有理由關閉?

+1

在我的應用程序關閉(可能由系統管理員)的時候,池中的對象可能正在使用中。但是,爲了釋放分配給這些對象的資源,我仍然需要在應用程序退出前關閉它們。理想情況下,在池上關閉()的調用將如下工作: 1)防止任何新對象被借用 2)關閉對象在池中閒置 3)關閉借用對象,因爲它們返回到池中,所有對象已被退回 這似乎並不是一個不尋常的要求。 – DrewEaster 2009-12-22 16:24:03

+1

Apache處理(1)和(2)。爲了解決問題(3),考慮子類化池類並自己處理close()。我猜想清除/排空池不在Apache實現中,因爲處理一般情況由於線程和超時問題是棘手的。 – jdigital 2009-12-22 17:02:53

+0

@drewzilla:(3a)如果池已關閉,Apache Commons Pool將返回借用對象,它現在位於[javadoc now](http://commons.apache.org/pool/apidocs/org/apache/commons/游泳池/ IMPL/GenericKeyedObjectPool.html#接近28%,29%)。 (3b)http://stackoverflow.com/questions/13355752/how-to-shutdown-a-generickeyedobjectpool-safely – palacsint 2012-11-13 04:55:24

0

如Commons Pool 2中close方法的javadoc所述,當調用此方法時,空閒實例被銷燬,但檢出到客戶端的實例不受影響。在close,borrowObject將失敗,IllegalStateException,但returnObject將成功,返回的實例將被銷燬。因此,如果您的客戶端可以被指望在關閉池後返回對象,則實例將被清除。如果你想阻止,直到完成,請看numActiveclose也從jmx註銷池,因此在這種情況下直接使用getNumActive

相關問題