Mybatis學習筆記——數據源

作者:亦山
來源:CSDN
原文:https://blog.csdn.net/luanlouis/article/details/37671851
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

連接池意義

在不使用連接池情況下,操作一次數據庫需要創建一個Connection對象,使用完以後調用close()方法 銷燬。在頻繁操作數據庫的情況下,需要頻繁的創建和銷燬Connection對象,代價非常高。使用連接池時,相當於創建了一堆連接對象,這些對象分爲兩種狀態,一種是空閒,另一種是使用中。當一個需要執行一個SQl語句時,從空閒區域調出一個Connection對象,使用完以後將Connection改爲空閒以便後面使用。

連接池的定義

數據庫連接池的基本思想就是爲數據庫連接建立一個“緩衝池”。預先在緩衝池中放入一定數量的連接,當需要建立數據庫連接時,只需要從緩衝池中取出一個了,使用完畢後再放回去。我們可以通過設定連接池最大數來防止系統無盡的與數據庫連接。更爲重要的是我們可以通過連接池的管理機制監視數據庫連接使用數量,使用情況,爲系統開發,測試以及性能調整提供依據。

Mybatis中數據源種類

  • UNPOOLED 不使用連接池數據源
  • POOLED 使用連接池數據源
  • JNDI 使用JNDI實現的數據源

UnpooledDataSource和PooledDataSource都實現了DataSource接口
在PooledDataSource中定義了UnPooledDataSource對象
PooledDataSrouce是通過UnPooledDataSource來實現連接池
PooledDataSource只是提供一種緩存連接池機制

<dataSource type="POOLED">
	<property name="driver" value="${jdbc.driverClassName}"/>
	<property name="url" value="${jdbc.url}"/>
	<property name="username" value="${jdbc.username}"/>
	<property name="password" value="${jdbc.password}"/>
</dataSource>

1、Mybatis在初始化時,解析此文件,根據的type屬性來創建相應的數據源dataSource,即Mybatis根據上面XML文件會創建PooledDataSource實現。

2、Mybatis根據工廠模式來創建數據源DataSource對象的,Mybatis定義了抽象的工廠接口org.apache.ibatis.datasource.DataSourceFactory,通過其getDataSource()方法返回數據源DataSource:

public interface DataSourceFactory {
    void setProperties(Properties var1);

    DataSource getDataSource();
}

3、DataSource什麼時候創建Connection對象
在SqlSession對象調用sql方法時,纔會觸發Mybatis在底層執行下面這個方法創建java.sql.Connection對象:
關於大佬這段博文中,我找不到這個方法:

protected void openConnection() throws SQLException {
    if (log.isDebugEnabled()) {
      log.debug("Opening JDBC Connection");
    }
    connection = dataSource.getConnection();
    if (level != null) {
      connection.setTransactionIsolation(level.getLevel());
    }
    setDesiredAutoCommit(autoCommmit);
  }

獲取java.sql.Connection對象的過程

 public Connection getConnection() throws SQLException {
    return popConnection(dataSource.getUsername(), dataSource.getPassword()).getProxyConnection();
  }
 
  public Connection getConnection(String username, String password) throws SQLException {
    return popConnection(username, password).getProxyConnection();
  }

上述的popConnection()方法,會從連接池中返回一個可用的PooledConnection對象,然後再調用getProxyConnection()方法最終返回Conection對象。

  1. 先看是否有空閒(idle)狀態下的PooledConnection對象,如果有,就直接返回一個可用的PooledConnection對象;否則進行第2步。
  2. 查看活動狀態的PooledConnection池activeConnections是否已滿;如果沒有滿,則創建一個新的PooledConnection對象,然後放到activeConnections池中,然後返回此PooledConnection對象;否則進行第三步;
  3. 看最先進入activeConnections池中的PooledConnection對象是否已經過期:如果已經過期,從activeConnections池中移除此對象,然後創建一個新的PooledConnection對象,添加到activeConnections中,然後將此對象返回;否則進行第4步。
  4. 線程等待第二步。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章