直接進入主題吧:
這張圖只是C3P0的部分結構類圖,不急,先對總體上有一個了解。
首先我們需要了解,C3P0是“懶初始化”的。也就是說它並不會自己初始化,而是會等到第一個連接請求進來之後它才會初始化。而那個觸發點就是:
ComboPooledDataSource.getConnection();
了解上面說的“懶初始化”之後,我們來介紹C3P0中幾個主要的類:
ComboPooledDataSource
: 和外界交互的類,主要負責
1. 設置連接池的配置
2. 獲取連接
C3P0PooledConnectionPoolManager
:連接池大管家,負責連接池的生命周期,並且提供一系列生命周期需要的生態環境:
1. 定時檢測任務AdminTaskTimer
2. 全局的線程池
C3P0PoolConnectionPool
:物理連接池對應的類,自身邏輯並不復雜,主要是通過委托給其代理的ResourcePool
來實現“池”的邏輯
BasicResourcePool
:ResourcePool
的實現類,抽象了一個“資源池”。剛才說到C3P0PooledConnectionPoolManager
是管理連接池的生命周期的,那麼BasicResourcePool
就是管理池中連接的生命周期的。值得注意的是,BasicResourcePool
並不是一個人在戰斗,它還有一個小伙伴——BasicResourcePool.Manager
來協助它一起管理池中的連接。
BasicResourcePool
中包含幾個任務:
1. 創建數據庫連接任務:ScatteredAcquireTask
,取代了老版本的AcquireTask
2. 銷毀數據庫連接任務:RemoveTask
,這個任務應該不常用
3. 檢測過期連接任務:CullTask
,當檢測到過期的連接時,則會去銷毀這些連接
4. 驗證空閒連接有效性任務:CheckIdleResourcesTask
&&AsyncTestIdleResourceTask