java資源池的實現
阿新 • • 發佈:2021-01-21
1、資源池
對於共享資源,有一個很著名的設計模式:資源池。該模式正是為了解決資源頻繁分配、釋放所造成的問題的。把該模式應用到資料庫連線管理領域,就是建立一個數據庫連線池,提供一套高效的連線分配、使用策略,最終目標是實現連線的高效、安全的複用。還有一類物件池大家可能不太瞭解,對於nio中有個堆外記憶體,netty的ByteBuf物件的實現就是一個可複用的物件池來提高效能。連線池大家平時聽的多,使用也多,但是自己實現應該比較少。
1.1 LinkedBlockingQueue應用例項
併發庫中的BlockingQueue是一個比較好玩的類,顧名思義,就是阻塞佇列。該類主要提供了兩個方法put()和take(),前者將一個物件放到佇列中,如果佇列已經滿了,就等待直到有空閒節點;後者從head取一個物件,如果沒有物件,就等待直到有可取的物件。
一個簡單的資源池可以使用LinkedBlockingQueue實現,需要的物件如下:
ICommonPool : 定義通用池,借出物件和歸還物件
PoolFactory :物件工廠,負責建立和銷燬物件
PoolConfig : 物件池的配置(最大連線數和最小連線數)
BaseCommonPool :物件池的主要基礎實現
1.2 commons-pool2實現資源池
PooledObject(池化物件) PooledObjectFactory(物件工廠) ObjectPool (物件池)
<dependency>
<groupId>org.apache.commons< /groupId>
<artifactId>commons-pool2</artifactId>
<version>2.6.2</version>
</dependency>
使用
@Autowired
private TestObjectPool testObjectPool;
public void test() {
TestObject testObject = null;
try {
testObject = testObjectPool. borrowObject();
//省略業務程式碼...
} catch (Exception e) {
e.printStackTrace();
} finally {
if (testObject != null) {
//最終歸還物件到物件池
testObjectPool.returnObject(testObject);
}
}
}