5、物理連接生命周期介紹
HikariCP中的連接取用流程如下:
其中HikariPool負責對資源連接進行管理,而ConcurrentBag則是作為物理連接的共享資源站,PoolEntry則是對物理連接的1-1封裝。
PoolEntry通過borrow方法從bag中取出,之后通過PoolEntry.createProxyConnection調用工廠類生成HikariProxyConnection返回。
HikariProxyConnection調用close方法時調用了PooleEntry的recycle方法,之后通過HikariPool調用了ConcurrentBag的requite放回。(poolEntry通過borrow從bag中取出,再通過requite放回。資源成功回收)。
HikariCP中的連接生成流程如下:
HikariCP中通過獨立的線程池addConnectionExecutor進行新連接的生成,連接生成方法為PoolEntryCreator。
物理鏈接的生成只由PoolBase的newConnection()實現,之后封裝成PoolEntry,通過Bag的add方法加入ConcurrentBag。
當ConcurrentBag存在等待線程,或者有連接被關閉時,會觸發IBagItemListener的addBagItem(wait)方法,調用PoolEntryCreator進行新連接的生成。
HikariCP中的連接關閉流程如下:
HikariCP中通過獨立的線程池closeConnectionExecutor進行物理連接的關閉。出現以下三種情況時會觸發連接的自動關閉:
- 連接斷開;
- 連接存活時間超出最大生存時間(maxLifeTime)
- 連接空閑時間超出最大空閑時間(idleTimeout)
closeConnectionExecutor關閉連接后,會調用fillPool()方法對連接池進行連接填充。
同時HikariPool提供evictConnection(Connection)方法對物理連接進行手動關閉。
以下是簡要的整理連接變化導向圖: