Mybatis中DataSource的存取
MyBatis是通過工廠模式來創建數據源DataSource對象的,MyBatis定義了抽象的工廠接口:org.apache.ibatis.datasource.DataSourceFactory,通過其getDataSource()方法返回數據源DataSource。
MyBatis創建了DataSource實例后,會將其放到Configuration對象內的Environment對象中, 供以后使用。
當我們需要創建SqlSession對象並需要執行SQL語句時,這時候MyBatis才會去調用dataSource對象來創建java.sql.Connection對象。
也就是說,java.sql.Connection對象的創建一直延遲到執行SQL語句的時候。
連接池:
我們在實際開發中都會使用連接池。
因為它可以減少我們獲取連接所消耗的時間。
Mybatis中的連接池
mybatis連接池提供了3種方式的配置:
配置的位置:
主配置文件SqlMapConfig.xml中的dataSource標簽,type屬性就是表示采用何種連接池方式。
type屬性的取值:
POOLED
采用傳統的javax.sql.DataSource規范中的連接池,mybatis中有針對規范的實現
連接池就是用於存儲連接的一個容器
容器其實就是一個集合對象, 該集合必須是線程安全的, 通能兩個線程拿到同一連接
該集合還必須實現隊列的特性:先進先出
UNPOOLED
采用傳統的獲取連接的方式,雖然也實現Javax.sql.DataSource接口,但是並沒有使用池的思想。
JNDI
采用服務器提供的JNDI技術實現,來獲取DataSource對象,不同的服務器所能拿到DataSource是不一樣。
注意:如果不是web或者maven的war工程,是不能使用的。
若使用tomcat服務器,采用的連接池是dbcp連接池
使用POOLED與UNPOOLED日志對比
使用UNPOOLED方式時: 加載驅動 創建一個新的連接 返回該連接
查看源碼UnpooledDataSource.java
使用POOLED方式時: 要保證線程安全
如果 空閑池 還有連接 的話直接拿一個出來用,
如果 空閑池 沒有可用的連接 , 會查看 活動池中的連接 是否已經達到 最大數量
如果 活動池中的連接 沒有 達到最大數量, 會創建一個新的連接
如果活動池中的連接已經達到最大數量, 會判斷活動池中哪個是最先進來的(Oldest), 然后對該鏈接進行處理並返回