iBatis核心框架淺析

1.1 iBatis配置與運行java

1.dal 層的dao接口實現類一般會繼承SqlMapClientDaoSupport。spring容器在初始化一個dao bean實例時,一般會注入兩塊信息DataSource(數據源)和sqlMapClient(主要是sql語句),這兩塊信息會封裝到SqlMapClientTemplate。spring

2. 其中數據源的實例一般採用apache的開源項目dbcp。代碼配置以下:sql

3. sqlMapClient數據庫

接下來就到了數據持久層的代碼調用,全部的數據庫DML操做(增、刪、改、查)都是藉助於SqlMapClientTemplate來實現。apache

1.2 SQL MAP引擎實現&數據庫框架app

一、SqlMapClient,僅是層SqlMapSessionImpl淺淺的薄紗。在SqlMapSessionImpl中以實現update爲例:框架

會調用TransactionManager的doInTransaction方法:ide

二、TransactionManager經過JDBCTransactionConfig採用Bridge模式構建出JDBCTransactionthis

Java事務類型分紅三類:JDBC事務、JTA(Java Transaction API)、和容器事務,JDBC事務經過java.sql.Connection實現。batis中transaction.getExcutor()返回依賴transaction的執行對象。在Excutor中調用JDBCTransaction.getConnection()返回的便是java.sql.Connection()。idea

三、Excutor

Excutor採用命令模式、依賴transaction對象,負責將Connection和MappedStatement組裝到handler中執行insert、update等語句,SimpleExcutor、BatchExcutor等繼承自該接口。

四、JdbcTrasaction中DataSource

DataSource,是Connection的工廠類,用於維護一個鏈接池。ibatis中有幾種類型:SimpleDataSource,C3P0。

SimpleDataSource實現中包含兩個代理線程池:idleConnectionsPool和activeConnectionsPool,並利用Proxy模式實現Connection訪問遠程數據庫,經過popConnection和pushConnection

來申請和釋放一個Proxy。申請時,對於ideal爲空、active已滿的狀況,循環判斷是否有棧底的Proxy已超過checkNum,超過設置閾值則執行autoCommit()、或rollback()並釋放資源。同時注意檢查Proxy連接狀態。Proxy類爲PooledConnection,利用InvocationHandler實現代理:

 1 class PooledConnection implements InvocationHandler {
 2 
 3  public Object invoke(Object proxy, Method method, Object[] args)
 4 
 5      throws Throwable {
 6 
 7    String methodName = method.getName();
 8 
 9    if (CLOSE.hashCode() == methodName.hashCode() && CLOSE.equals(methodName)) {
10 
11      dataSource.pushConnection(this);
12 
13      return null;
14 
15    } else {
16 
17        if (method.getDeclaringClass() != Object.class) {
18 
19          // throw an SQLException instead of a Runtime
20 
21          checkConnection();
22 
23        }
24 
25        return method.invoke(realConnection, args);
26 
27    } // else
28 
29  } // invoke
30 
31 } // class

另外,C3P0是一個高效的開源JDBC鏈接池。Ibatis能夠支持C3P0的配置。

相關文章
相關標籤/搜索