1. 程式人生 > >【Mybatis原始碼分析】Mybatis原始碼分析-資料庫連線池

【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這兩個方法,這兩個方法用到了生產者和消費者模式,由於連線沒有單獨的執行緒處理連線池的有效連線,所以在取放時會檢查連線的有效性。