基於Apache commons-pool2的池化技術

使用的是Apache commons-pool2包

基於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實現,維護池化對象的一系列狀態參數。

基於Apache commons-pool2的池化技術

1.自定義工廠創建對象

基於Apache commons-pool2的池化技術

基於Apache commons-pool2的池化技術

其中DefaultPooledObject 是對我們定義的User類的包裝裡面包裝了基礎的用於維護的屬性

2.wrap對象關係

基於Apache commons-pool2的池化技術

ObjectPool類族 ObjectPool類族包含了以ObjectPool為代表的一系列pool,其中最主要的兩類就是ObjectPool和KeyedObjectPool,他們分別針對普通的pool和以名值對映射的pool。

基於Apache commons-pool2的池化技術

添加配置

基於Apache commons-pool2的池化技術


分享到:


相關文章: