zoukankan      html  css  js  c++  java
  • iBatis核心框架浅析

    1.1 iBatis配置与运行

    1.dal 层的dao接口实现类通常会继承SqlMapClientDaoSupport。spring容器在初始化一个dao bean实例时,通常会注入两块信息DataSource(数据源)和sqlMapClient(主要是sql语句),这两块信息会封装到SqlMapClientTemplate。

    2. 其中数据源的实例通常采用apache的开源项目dbcp。代码配置如下:

    3. sqlMapClient

    接下来就到了数据持久层的代码调用,所有的数据库DML操作(增、删、改、查)都是借助于SqlMapClientTemplate来实现。

    1.2 SQL MAP引擎实现&数据库框架

    1、SqlMapClient,仅是层SqlMapSessionImpl浅浅的薄纱。在SqlMapSessionImpl中以实现update为例:

    会调用TransactionManager的doInTransaction方法:

    2、TransactionManager通过JDBCTransactionConfig采用Bridge模式构建出JDBCTransaction

    Java事务类型分成三类:JDBC事务、JTA(Java Transaction API)、和容器事务,JDBC事务通过java.sql.Connection实现。batis中transaction.getExcutor()返回依赖transaction的执行对象。在Excutor中调用JDBCTransaction.getConnection()返回的即是java.sql.Connection()。

    3、Excutor

    Excutor采用命令模式、依赖transaction对象,负责将Connection和MappedStatement组装到handler中执行insert、update等语句,SimpleExcutor、BatchExcutor等继承自该接口。

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

  • 相关阅读:
    CSS中em,rem的区别
    Bootstrap自学笔记
    lable标签的妙用
    Ajax
    基础小知识杂烩
    用CSS3画出一个立方体---转
    CSS3方法总汇
    HTML5 DOM扩展
    VS2010在C盘下生成的.iTrace文件解决办法 ,c盘偷偷的减少,心很烦啊,找了半天才知道是这个问题
    伪静态
  • 原文地址:https://www.cnblogs.com/icanth/p/3495588.html
Copyright © 2011-2022 走看看