使用的是Apache commons-pool2包
Common-pool2由三大模塊組成:ObjectPool、PooledObject和PooledObjectFactory。
ObjectPool:提供所有對象的存取管理。
PooledObject:池化的對象,是對對象的一個包裝,加上了對象的一些其他信息,包括對象的狀態(已用、空閒),對象的創建時間等。
PooledObjectFactory:工廠類,負責池化對象的創建,對象的初始化,對象狀態的銷燬和對象狀態的驗證。
ObjectPool會持有PooledObjectFactory,將具體的對象的創建、初始化、銷燬等任務交給它處理,其操作對象是PooledObject,即具體的Object的包裝類。
org.apache.commons.pool2.impl 包提供了一個默認的對象池實現。
主要還是這三個模塊的實現,其中PooledObjectFactory在包裡沒有具體實現,因為這涉及到具體對象的創建,需要應用本身去實現,這也體現了設計上的解耦合性。
BaseGenericObjectPool
它主要定義了對象池的一些配置信息和實現jmx註冊註銷等功能。
以下是對象池的相關配置
GenericObjectPool
數據結構:ConcurrentHashMap和LinkedBlockingDeque。前者用於存儲所有的對象(不含銷燬的對象),後者用於存儲空閒的對象。
borrowObject()大體思路如下
1 從LinkedBlockingDeque中pollFirst
2 若為空,檢查對象池對象是否達到上限,若是重複1,若否,則調用PooledObjectFactory的makeObject去創建一個對象
3 得到對象之後,對對象進行初始化和一些配置的計數處理,同時將對象加入到ConcurrentHashMap。
returnObject(T obj)大體思路如下
1 根據obj從ConcurrentHashMap拿到其對應的PooledObject p
2 判空;將p狀態置為RETURN
3 若getTestOnReturn參數為true,進行validateObject
4 對p進行passivateObject,與初始化相反
5 更新p狀態為IDLE
6 歸還Pool:Pool的idle實例達到上限或者Pool已經關閉,銷燬之,否則將p加入到LinkedBlockingDeque中。
DefaultPooledObject
默認的PooledObject實現,維護池化對象的一系列狀態參數。
1.自定義工廠創建對象
其中DefaultPooledObject 是對我們定義的User類的包裝裡面包裝了基礎的用於維護的屬性
2.wrap對象關係
ObjectPool類族 ObjectPool類族包含了以ObjectPool為代表的一系列pool,其中最主要的兩類就是ObjectPool和KeyedObjectPool,他們分別針對普通的pool和以名值對映射的pool。
添加配置
閱讀更多 東方既白 的文章