【Mybatis原始碼分析】Mybatis原始碼分析-資料庫連線池
Mybatis支援三種類型的資料來源處理:JNDI、無連線池和有連線池功能資料來源,有連線池功能是在無連線池功能的基礎上增加了連線池的處理。
Mybatis的資料來源管理是通過工廠模式實現,通過DataSourceFactory介面實現不同功能的資料來源管理工廠。
一、 UnPooled
- UnpooledDataSourceFactory
通過SystemMetaObject(後續分析)反射注入屬性
- UnpooledDataSource
1. 在載入時會將所有初始化的驅動存到registeredDrivers中
2. 通過對DriverManager類的原始碼分析可以看到,是從內部變數registeredDrivers中取已註冊的驅動資訊,這個驅動的註冊是每一個數據庫驅動程式完成的,下面是mysql的驅動註冊呼叫鏈。
3. UnpooledDataSource由於是沒有連線池,所以每次會新建立一個Connection,每次會包括三步:初始化驅動、建立Connection,配置事務級別和事務的自動提交。
1) 初始化驅動和建立Connection
在這裡用了一個代理驅動內部類DriverProxy
2) 配置事務級別和事務的自動提交
二、 JNDI
JndiDataSourceFactory工廠直接從JNDI上下文InitialContext取資料庫連線,此處略
三、 Pooled
連線池管理主要包括以下幾個類
1. PooledConnection是一個動態代理物件自代理,當PooledDataSource取連線池中的Connection時取的是代理物件,而不是真實的Connction。當使用代理物件時主要是對Connection養老物件進行了代理,將其放入到連線池中。
2. PooledDataSource類是一個連線池物件,核心幾個方法為
pushConnection方法是在PooledConnection代理時呼叫的
popConnection方法是在getConnection時使用的,取的就是一個代理連線
PoolState類用於封裝PooledDataSource、idle和acitive的Connection,在PooledDataSource的pushConnection和popConnection中的操作都是針對這個類進行的。
下面重點分析一下pushConnection和popConnection這兩個方法,這兩個方法用到了生產者和消費者模式,由於連線沒有單獨的執行緒處理連線池的有效連線,所以在取放時會檢查連線的有效性。