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实现代理:

 class PooledConnection implements InvocationHandler {

  public Object invoke(Object proxy, Method method, Object[] args)

      throws Throwable {

    String methodName = method.getName();

    if (CLOSE.hashCode() == methodName.hashCode() && CLOSE.equals(methodName)) {

      dataSource.pushConnection(this);

      return null;

    } else {

        if (method.getDeclaringClass() != Object.class) {

          // throw an SQLException instead of a Runtime

          checkConnection();

        }

        return method.invoke(realConnection, args);

    } // else

  } // invoke

 } // class

另外,C3P0是一个高效的开源JDBC连接池。Ibatis可以支持C3P0的配置。

iBatis核心框架浅析的更多相关文章

  1. CI框架浅析(二)

    该文延续上篇文章: CI框架浅析(一) 在CI框架的核心库中,CodeIgniter.php负责加载所有需要的类库,第一个加载的是公共库 core/Common.php Common.php 负责加载 ...

  2. CI框架浅析

    CI框架浅析(全篇)     业余花了点时间看看CodeIgniter框架(简称CI),CI目前的稳定版本是 3.X,4.0版本已经出来了,但还在测试中,所以我分析的还是 3.x 版本. CI是一个很 ...

  3. 10天学会phpWeChat——第一天:核心框架的目录结构

    phpWeCaht是一款优秀的PC网站+微信公共号开发框架. 本博客系列将图文结合,详细介绍phpWeChat 的使用方法,今天进入phpWeChat系列教程之<10天学会phpWeChat&g ...

  4. MVC框架浅析(基于PHP)

    MVC框架浅析(基于PHP) MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数 ...

  5. 程序员的自我救赎---1.4.2: 核心框架讲解(BLL&Tool)

    <前言> <目录> (一) Winner2.0 框架基础分析 (二) 短信中心 (三)SSO单点登录 (四)PLSQL报表系统 (五)钱包系统 (六)GPU支付中心 (七)权限 ...

  6. 程序员的自我救赎---1.4.3: 核心框架讲解(MVC)

    <前言> (一) Winner2.0 框架基础分析 (二)PLSQL报表系统 (三)SSO单点登录 (四) 短信中心与消息中心 (五)钱包系统 (六)GPU支付中心 (七)权限系统 (八) ...

  7. 程序员的自我救赎---1.4.1:核心框架讲解(DAL)

    <前言> (一) Winner2.0 框架基础分析 (二)PLSQL报表系统 (三)SSO单点登录 (四) 短信中心与消息中心 (五)钱包系统 (六)GPU支付中心 (七)权限系统 (八) ...

  8. 追源索骥:透过源码看懂Flink核心框架的执行流程

    li,ol.inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-bottom:20px}dt, ...

  9. TensorFlow RNN MNIST字符识别演示快速了解TF RNN核心框架

    TensorFlow RNN MNIST字符识别演示快速了解TF RNN核心框架 http://blog.sina.com.cn/s/blog_4b0020f30102wv4l.html

随机推荐

  1. R语言学习笔记(数据预处理)

    setwd("d:/r/r-data/")data=read.table("salary.txt",header=T)attach(data)mean(Sala ...

  2. 【solr基础教程之九】客户端

    一.Java Script 1.由于Solr本身可以返回Json格式的结果,而JavaScript对于处理Json数据具有天然的优势,因此使用JavaScript实现Solr客户端是一个很好的选择. ...

  3. git merge 分支

    把master merge到apple_campus1.git stash2.git checkout master3.git pull4.git checkout apple_campus5.git ...

  4. js阻止事件冒泡的方法

    /********************************************js方法*************************************************** ...

  5. Socket 编程示例(二)

    利用晚上这点闲暇时间,写了一个Socket通信的小实例,该实例包含服务器端和客户端.其基本工作流程是:当服务器启动服务以后,客户端进行连接,如果连接成功,则用户可以在发送消息框中输入待发送的消息,然后 ...

  6. C#操作XML文档(XmlDocument、XmlNode、XmlAttribute、SelectSingleNode、SelectNodes、XmlNodeList)

    XML文档是一种通用的文档,这种文档既可以用.config作为后缀也可以用.xml作为后缀.XML文档主要由元素节点和节点的属性共同构成的.它有且仅有一个根节点,其他的节点全部都是根节点的子节点或者子 ...

  7. ArcGIS for WPF 访问外部资源【进阶之构造URL】

    原文 http://www.cnblogs.com/wdysunflower/archive/2013/05/29/3039645.html 呵呵~好久没逛园子,没写博客了. 最近刚好又在弄GIS这块 ...

  8. 【转】6.4.6 将驱动编译进Linux内核进行测试

    原文网址:http://www.apkbus.com/android-98520-1-1.html 前面几节都是将Linux驱动编译成模块,然后动态装载进行测试.动态装载驱动模块不会随着Android ...

  9. bzoj2100 [Usaco2010 Dec]Apple Delivery

    Description Bessie has two crisp red apples to deliver to two of her friends in the herd. Of course, ...

  10. OpenGL进阶(十一) - GLSL4.x中的数据传递

    in out 对于 vertex shader,每个顶点都会包含一次,它的主要工作时处理关于定点的数据,然后把结果传递到管线的下个阶段. 以前版本的GLSL,数据会通过一些内建变量,比如gl_Vert ...