連接池—Mybatis

Mybatis中採用的自己的連接池技術,在Mybatis的SqlMapConfig.xml配置文件中,通過來實現Mybatis中連接池的配置
一、Mybatis連接池的分類
在Mybatis中我們將他的數據源dateSource分爲以下幾類
在這裏插入圖片描述
可以看出Mybatis將他自己的數據源分爲三類:
UNpooled: 不適用連接池的數據源
Pooled: 使用連接池的數據源
JNDI: 使用JNDI實現的數據源
相應的,MyBatis 內部分別定義了實現了 java.sql.DataSource 接口的 UnpooledDataSource,
PooledDataSource 類來表示 UNPOOLED、POOLED 類型的數據源
在這裏插入圖片描述
PooledDateSource和UnpooledDateSource都實現了DateSource接口並且PooledDateSource持有一個UnpooledDateSource的引用,當PooledDateSource需要創建java.sql.Connection實例化對象時,還是通過UnpooledDateSource來創建,PooledDateSource只是提供了一種緩存連接池機制。

在這三種數據源中,我們一般採用的是 POOLED 數據源(很多時候我們所說的數據源就是爲了更好的管理數據
庫連接,也就是我們所說的連接池技術)。

我們的數據源配置就是在 SqlMapConfig.xml 文件中,具體配置如下:

<!-- 配置數據源(連接池)信息 --> 
<dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
MyBatis 在初始化時,根據的 type 屬性來創建相應類型的的數據源 DataSource,即: type=”POOLED”:MyBatis 會創建 PooledDataSource 實例 type=”UNPOOLED” : MyBatis 會創建 UnpooledDataSource 實例 type=”JNDI”:MyBatis 會從 JNDI 服務上查找 DataSource 實例,然後返回使用

Mybatis中的DateSource的存取
Mybatis是通過工廠模式來創建數據源DateSource對象,Mybatis定義了抽象的工廠方法接口:org.apache.ibatis.datasource.DataSourceFactory,通過其 getDataSource()方法返回數據源
DataSource。
下面是DateSourceFactory的源碼

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.apache.ibatis.datasource;

import java.util.Properties;
import javax.sql.DataSource;

public interface DataSourceFactory {
    void setProperties(Properties var1);

    DataSource getDataSource();
}

MyBatis 創建了 DataSource 實例後,會將其放到 Configuration 對象內的 Environment 對象中, 供
以後使用。
具體分析過程如下:
1.先進入 XMLConfigBuilder 類中,可以找到如下代碼
在這裏插入圖片描述
2.分析 configuration 對象的 environment 屬性,結果如下
在這裏插入圖片描述
Mybatis 中連接的獲取過程分析
當我們需要創建 SqlSession 對象並需要執行 SQL 語句時,這時候 MyBatis 纔會去調用 dataSource 對象來創建java.sql.Connection對象。也就是說,java.sql.Connection對象的創建一直延遲到執行SQL語句的時候。

@Test
public void testSql() throws Exception {
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
SqlSession sqlSession = factory.openSession();
List<User> list = sqlSession.selectList("findUserById",41);
System.out.println(list.size());
}

只有當第 4 句 sqlSession.selectList(“findUserById”),纔會觸發 MyBatis 在底層執行下面這個方
法來創建 java.sql.Connection 對象。
如何證明它的加載過程呢?
我們可以通過斷點調試,在 PooledDataSource 中找到如下 popConnection()方法,如下所示
在這裏插入圖片描述
分析源代碼,得出 PooledDataSource 工作原理如下:
在這裏插入圖片描述
下面是連接獲取的源代碼:
在這裏插入圖片描述
最後我們可以發現,真正連接打開的時間點,只是在我們執行SQL語句時,纔會進行。其實這樣做我們也可以進一步發現,數據庫連接是我們最爲寶貴的資源,只有在要用到的時候,纔去獲取並打開連接,當我們用完了就再立即將數據庫連接歸還到連接池中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章