在 Mybatis 的 SqlMapConfig.xml 組態檔中,通過<dataSource type=”pooled”>來實作 Mybatis 中連接池的配置, 一、Mybatis連接池的分類 在Mybatis中,我們將他的資料源dataSource分為以下幾類:
可以看出Mybatis將資料源分為三類
UNPOOLED 不使用連接池的資料源
POOLED 使用連接池的資料源
JNDI 使用JNDI實作的資料源
具體結構如下:

相應的,Mybatis內部分別定義實作了java.sql.DataSource介面的UnPooledDataSource,PooledDataSource類來標識兩種型別的資料源

在這三種資料源中,我們一般采用的是Pooled資料源,很多時候我們所說的資料源就是為了更好的管理資料庫連接,也就是我們所說的連接池技術
二、Mybatis中資料源的配置
我們的資料源配置就是在SqlMapConfigxml檔案中,具體配置如下:
<!-- 配置資料源(連接池)資訊 --> <dataSource type="POOLED">MyBatis 在初始化時,根據<dataSource>的 type 屬性來創建相應型別的的資料源 DataSource,即: type=”POOLED”:MyBatis 會創建 PooledDataSource 實體 type=”UNPOOLED” : MyBatis 會創建 UnpooledDataSource 實體 type=”JNDI”:MyBatis 會從 JNDI 服務上查找 DataSource 實體,然后回傳使用 三、Mybatis中DataSource的存取 MyBatis 是 通 過 工 廠 模 式 來 創 建 數 據 源 DataSource 對 象 的 , MyBatis 定 義 了 抽 象 的 工 廠 接 口:org.apache.ibatis.datasource.DataSourceFactory,通過其 getDataSource()方法回傳資料源 DataSource, 下面是 DataSourceFactory 原始碼,具體如下:
<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>
package org.apache.ibatis.datasource; import java.util.Properties; import javax.sql.DataSource; /** * @author */ public interface DataSourceFactory { void setProperties(Properties props); 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()方法,如下所示:


下面是連接獲取的源代碼:
最后我們可以發現,真正連接打開的時間點,只是在我們執行SQL陳述句時,才會進行,其實這樣做我們也可以 進一步發現,資料庫連接是我們最為寶貴的資源,只有在要用到的時候,才去獲取并打開連接,當我們用完了就再 立即將資料庫連接歸還到連接池中
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/176244.html
標籤:Java
下一篇:介面
