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的配置。