Apache Commons Pool官方文檔
Apache Commons Pool 開源軟件庫提供了一個對象池API和一係列對象池實現。Apache Commons Pool 2.x與1.x相比實現了一個可重寫的對象池實現。另外,性能和可伸縮性也有了改進,2.x版本包含魯棒的實例追蹤和對象池監控。2.x版本需要JDK6以上版本。
發布
查看下載頁麵獲取發行版本。
特性
org.apache.commons.pool2包下定義了幾個對象池接口和基類,在創建新的對象池實現時可
以參考。
PooledObjectFactory
PooledObjectFactory提供了一個管理對象池對象生命周期的通用接口。
public interface PooledObjectFactory<T> {
PooledObject<T> makeObject();
void activateObject(PooledObject<T> obj);
void passivateObject(PooledObject<T> obj);
boolean validateObject(PooledObject<T> obj);
void destroyObject(PooledObject<T> obj);
}
使用1.x版本的用戶應該會注意到,在1.x中直接通過創建PoolableObjectFactorys來管理對象
池內的對象,版本2中通過PooledObjectFactorys來管理對象池內的對象(PooledObject)。
這些包裝器對象維護對象池的狀態,可以通過PooledObjectFactory內的方法來訪問比如對象
池內某個對象的創建時間或最後使用時間。DefaultPooledObject類可以用來追蹤對象池內對
象的狀態。實現一個PoolableObjectFactory的最簡單方式就是通過繼承
BasePooledObjectFactory。BasePooledObjectFactory提供了一個makeObject()方法,這個
方法內部實現為wrap(create()),其中wrap和create都是抽象方法。你可以通過實現create方
法來創建你想通過對象來管理的底層對象,然後通過wrap方法來包裝在PooledObject中創建
的實例。使用DefaultPooledObject包裝器,可以如下
@Override
public PooledObject<Foo> wrap(Foo foo) {
return new DefaultPooledObject<Foo>(foo);
}
這裏的Foo是一個被“池化”的類型(create()方法返回的類型)。KeyedPooledObjectFactory
也為KeyedObjectPool定義了一個類似的接口:
public interface KeyedPoolableObjectFactory<K,V> {
PooledObject<V> makeObject(K key);
void activateObject(K key, PooledObject<V> obj);
void passivateObject(K key, PooledObject<V> obj);
boolean validateObject(K key, PooledObject<V> obj);
void destroyObject(K key, PooledObject<V> obj);
}
BaseKeyedPooledObjectFactory提供了KeyedPooledObjectFactory的一個抽象實現。
org.apache.commons.pool2.impl 包下提供了對象池實現。
GenericObjectPool
GenericObjectPool提供了一係列配置選項,比如可以容納的活躍或者空閑的實例個數,空閑
對象的清除策略,等等。在版本2中,還提供對被遺棄對象的追蹤和移除。
SoftReferenceObjectPool
SoftReferenceObjectPool可以根據需要增長,但是可以允許虛擬機在需要時從對象池中清除
對象。
對象池從2.x遷移到2.y
使用2.x係列版本的客戶端代碼在使用最新的2.x發行版本時不需要做任何改變。
新的2.x發行版可能會支持一些新的配置屬性。這些將會在變更日誌中列出。需要注意,
Apache Commons Pool中的MBean接口(以MXBean或MBean結尾),比如
DefaultPooledObjectInfoMBean, GenericKeyedObjectPoolMXBean 或者
GenericKeyedObjectPoolMXBean為了支持新的屬性,在不同版本之間發生改變。這些接口
不應該被客戶端所實現,所以這些接口不需要考慮向後兼容性.
對象池從1.x遷移到2.x
Apache Commons Pool從1.x遷移到2.x需要一些代碼改動。最大改動應該是包
org.apache.commons.pool更名為org.apache.commons.pool2和PooledObjectFactory的一些
實現類發生了改變。
雖然一些屬性的名稱為了一致性已經發生了改變,但是Apache Commons Pool確保了同名的屬性在不同版本的池中有相同的含義。一些關鍵的實現類(GenericObjectPool 和 GenericKeyedObjectPool)保留了原來的屬性,所以我們在升級的過程中可以不用修改這些屬性的名稱。不過,我們還是推薦使用新的屬性名稱。轉載自 並發編程網 - ifeve.com
最後更新:2017-05-19 15:32:05