前幾天和同事聊天,同事做c++的,聊到c++沒有很好的數據庫連接池庫,同事想自己寫一個,但擔心自己考慮不全面。我不以爲然,數據庫連接池而已,又不是沒寫過,沒有open source之前,還不是自己寫。同事卻認爲定我考慮的不全面。所以,才找來jakata common pools的源碼看看。
jakata common pools中主要就以下三個接口
ObjectPool 連接池
ObjectPoolFactory 連接池工廠
PoolableObjectFactory 連接工廠
擴展開有:
基於key值管理的實現接口:
KeyedObjectPool
KeyedObjectPoolFactory
KeyedPoolableObjectFactory
繼續擴展:
基於key值管理的一個簡單實現的接口
BaseKeyedObjectPool
................
同時提供了BaseKeyedObjectPool的幾種算法的實現,主要集中在對象在pools中的儲存的數據結構不同。
功能上:
ObjectPool :
borrowObject 獲取連接
returnObject 返回連接
invalidateObject(Object obj) 驗證連接是否可用
addObject() 增加連接
getNumActive 獲取活動連接數目
clear 清空
close 關閉
在實現中,提供了一些額外的功能:(以GenericKeyedObjectPool 爲例)
maxIdle 最大空閒連接
maxActive 最大活躍連接
maxTotal 最大總數
minIdle 最小空閒
maxWait 最大阻塞時間
whenExhaustedAction 數據庫連接沒有後,如何處理
testOnBorrow 獲取連接時,是否測試連接
testOnReturn 返回連接是否測試連接
testWhileIdle 空閒是否測試連接
timeBetweenEvictionRunsMillis 測試連接時間間隔
numTestsPerEvictionRun 空閒時同時測試連接數目
minEvictableIdleTimeMillis 最小可避免空閒時間。
所有可能產生併發的地方都使用了synchronized進行了串行化。效率一般。實現較爲簡單