`
crazier9527
  • 浏览: 1011488 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ibatis DAO 事务

    博客分类:
  • Java
阅读更多

ibatis DAO 框架提供了事务管理模块。而这个事务管理可以应用到很多场合,包括JDBC、Hibernate、JTA、SQLMAP等。
下面以最简单的JDBC来分析一下其如何实现事务管理。
首先来看一段代码:

public class OrderService {

  private DaoManager daoManager;

  private OrderDao orderDao;

  public OrderService() {
    daoManager = DaoConfig.getDaoManager();
    orderDao = (OrderDao) daoManager.getDao(OrderDao.class);
  }

  public void method() {
    try {
      //  a separate transaction
      orderDao.method1();   //第一个事务

      daoManager.startTransaction(); //开始第二个事务

      orderDao.method1();
      orderDao.method2();

      daoManager.commitTransaction();//提交第二个事务
    } finally {
      daoManager.endTransaction();
    }
  }
  }

在method()方法里有着两个事务,如果在方法里不显式的调用daoManager.startTransaction(),则每个DAO的一次方法调用就是一个独立的事务。
  ibatis DAO事务,有两个核心接口DaoTransactionManager和DaoTransaction
  对应着不同的数据库持久层实现,两个接口分别对应着不同实现
  查看ibatis 代码,可以发现这些manager实现事务,就是调用事务源的事务操作方法

  JdbcDaoTransactionManager

public void commitTransaction(DaoTransaction trans) {
    ((JdbcDaoTransaction) trans).commit();
  }

 

JdbcDaoTransaction

public JdbcDaoTransaction(DataSource dataSource) {
    try {
      connection = dataSource.getConnection();
      if (connection == null) {
        throw new DaoException("Could not start transaction.  Cause: The DataSource returned a null connection.");
      }
      if (connection.getAutoCommit()) {
        connection.setAutoCommit(false);
      }
      if (connectionLog.isDebugEnabled()) {
        connection = ConnectionLogProxy.newInstance(connection);
      }
    } catch (SQLException e) {
      throw new DaoException("Error starting JDBC transaction.  Cause: " + e);
    }
  }
  
  public void commit() {
    try {
      try {
        connection.commit();
      } finally {
        connection.close();
      }
    } catch (SQLException e) {
      throw new DaoException("Error committing JDBC transaction.  Cause: " + e);
    }
  }

 

  那么DaoTransactionManager以什么依据处理事务呢?DaoTransactionState看看DaoTransactionState的代码,非常简单,四个常量来表示事务处于的不同的状态

  public static final DaoTransactionState ACTIVE = new DaoTransactionState();
  public static final DaoTransactionState INACTIVE = new DaoTransactionState();
  public static final DaoTransactionState COMMITTED = new DaoTransactionState();
  public static final DaoTransactionState ROLLEDBACK = new DaoTransactionState(); 

 

那么实际程序中是如何控制事务的呢
  在第一段代码中,我们是这样取得DAO
  orderDao = (OrderDao) daoManager.getDao(OrderDao.class);
  实际daoManager返回的并不是orderDao的具体实现类,它返回的DaoProxy

DaoProxy

public Object invoke(Object proxy, Method method, Object[] args)
      throws Throwable {
    Object result = null;
    if (PASSTHROUGH_METHODS.contains(method.getName())) {
      try {
        result = method.invoke(daoImpl.getDaoInstance(), args);
      } catch (Throwable t) {
        throw ClassInfo.unwrapThrowable(t);
      }
    } else {
      StandardDaoManager daoManager = daoImpl.getDaoManager();
      DaoContext context = daoImpl.getDaoContext();

      if (daoManager.isExplicitTransaction()) {
        // Just start the transaction (explicit)
        try {
          context.startTransaction();
          result = method.invoke(daoImpl.getDaoInstance(), args);
        } catch (Throwable t) {
          throw ClassInfo.unwrapThrowable(t);
        }
      } else {
        // Start, commit and end the transaction (autocommit)
        try {
          context.startTransaction();
          result = method.invoke(daoImpl.getDaoInstance(), args);
          context.commitTransaction();
        } catch (Throwable t) {
          throw ClassInfo.unwrapThrowable(t);
        } finally {
          context.endTransaction();
        }
      }

    }
    return result;
  }

 

  看到这段代码就非常清楚了,每调用DAO的一次方法时,如果不显式的调用daoManager.startTransaction(),就会成为单独的一个事务。再看看ibatis为我们提供的摸板JdbcDaoTemplate

protected Connection getConnection() {
    DaoTransaction trans = daoManager.getTransaction(this);
    if (!(trans instanceof ConnectionDaoTransaction)) {
      throw new DaoException("The DAO manager of type " + daoManager.getClass().getName() +
          " cannot supply a JDBC Connection for this template, and is therefore not" +
          "supported by JdbcDaoTemplate.");
    }
    return ((ConnectionDaoTransaction) trans).getConnection();
  }

 

  ibatis控制多个DAO的事务实际是让这些DAO共用了一个DaoTransaction(ThreadLocal),一个Connection
 
  这里是一个事务源的情况,如果多个事务源之间要完成全局事务,还是老老实实用分布式事务管理服务吧(jta)

分享到:
评论

相关推荐

    iBATIS-DAO-2.3.4.726.rar_com.ibatis.dao_iBATIS dao 2_iBatis DAO_

    iBATIS DAO是Java开发中的一个持久层框架,它提供了数据访问对象(DAO)的实现,使得数据库操作更加简单和灵活。在这个2.3.4.726版本的源码中,我们可以深入理解iBATIS DAO的工作原理,并通过添加注释来帮助我们更好...

    IBATISDAO库类操作

    此外,事务管理也是`IBATISDAO`库类中重要的一部分。在执行一系列数据库操作时,可以通过`SqlMapClientTransactionManager`来控制事务的开启、提交和回滚,保证数据的一致性。 **5. 扩展性和性能优化** `IBATISDAO...

    ibatisDao.rar

    本资料“ibatisDao.rar”包含了一份对iBATIS DAO框架的深入分析,旨在帮助开发者更好地理解和应用这一技术。 在iBATIS中,DAO(Data Access Object)是数据库访问对象,它封装了对数据库的增删查改操作。DAO模式是...

    iBATIS_DAO-2.2.0.638

    iBATIS DAO 2.2.0.638是一个特定版本的iBATIS框架,这个版本提供了对数据库操作的灵活支持,简化了SQL与Java代码的集成,使开发者能够更高效地处理数据库事务。 iBATIS的核心理念是将SQL语句直接写在XML配置文件中...

    ibatis--dao的应用

    首先,Ibatis的配置文件(通常为`SqlMapConfig.xml`)是整个框架的入口,它包含了数据源配置、事务管理器和其他全局设置。在这个文件中,你可以定义多个数据源,每个数据源对应一个`<transactionManager>`和`...

    iBATIS-DAO-2_en

    在IT领域,尤其是在Java开发中,iBATIS与DAO(Data Access Object)模式的结合为开发者提供了一种高效、灵活且可扩展的数据访问方案。本文将深入探讨iBATIS实现DAO的相关知识点,包括其背景、原理、优势以及具体实现...

    ibatis 完美例子 一对多 批处理 事务 和 spring struts2集成

    结合Ibatis,我们可以创建一个Action类,注入Service,Service再注入Dao,其中Dao使用Ibatis的SqlSession进行数据库操作。Struts2的拦截器可以与Spring的AOP配合,实现如权限控制等功能。在配置文件中,需要配置...

    J2EE核心:iBatis_DAO入门与进阶.doc

    本文将引导读者逐步将一个使用SQL Maps的应用转换为基于iBatis DAO框架的应用,并讨论DAO框架的构建、事务管理以及如何自定义事务管理模块。通过这个过程,读者可以深入理解iBatis DAO如何简化数据访问层的开发,...

    IBatis常用操作封装

    在`IBatisDao`中,通常会有一个事务管理类来包裹这些操作,确保数据的一致性。 6. **缓存支持**:`IBatis`提供了本地缓存和二级缓存机制,可以提高数据读取效率。在`IBatisDao`中,可能有开启和关闭缓存的配置。 7...

    hibernate3.jar、ibatis-dao-2.jar、spring.jar、struts.jar、log4j-1.2.9.jar

    5. **iBatis-dao-2.jar**:iBatis(在本例中可能是iBATIS DAO的特定版本)是另一种ORM框架,不同于Hibernate,它更强调SQL的灵活性。iBatis允许开发者编写自定义的SQL,将SQL语句直接嵌入XML配置文件或Java代码中,...

    ibatis相关的common,dao,sqlmap包

    这个压缩包包含了Ibatis的三个关键组件:common、dao和sqlmap,它们各自扮演着不同的角色,共同构成了Ibatis框架的核心功能。 1. **Ibatis-common**: Ibatis-common 包含了Ibatis框架的基础工具类和通用模块,...

    ibatis源码

    3. **事务管理**:iBATIS支持事务的自动提交和回滚,可以根据不同的数据库配置进行事务控制。 4. **结果映射**:iBATIS能将查询结果自动映射到Java对象,减少了手动转换的工作量。 5. **动态SQL**:通过iBATIS的...

    ibatis文档

    - **Dao 事务管理**: iBATIS 提供了多种事务管理器实现,如 JtaDaoTransactionManager、JdbcDaoTransactionManager 等,用于处理不同类型的事务逻辑。 ##### 2.2 iBATIS DAO 架构设计 iBATIS 的 DAO 层采用了 ...

    ibatis的批量插入DAO实例

    4. **实现DAO接口**:虽然Ibatis使用动态代理自动实现了DAO接口,但我们还需要提供一个接口实现类,以便在需要的时候进行事务控制。 5. **编写Service逻辑**:在业务层,我们收集要插入的数据到List中,然后调用DAO...

    ibatis官方资料及所需要的Jar包

    Ibatis官方资料大全提供了全面的学习资源,包括ibatis-common.jar、ibatis-Dao.jar和ibatis-sqlmap.jar等核心组件的详细讲解和相关jar文件,是学习和使用Ibatis不可或缺的参考资料。 首先,我们来了解一下ibatis-...

    ibatis-api中文(真的中文)

    这个教程将带你逐步了解如何设置iBATIS环境,创建数据库连接,编写和测试SQL Maps,以及处理事务管理。它可能是初学者入门iBATIS的绝佳资源,因为它以中文呈现,使得国内开发者更容易理解。 总的来说,这些文档覆盖...

    ibatis总结 ibatis ibatis ibatis ibatis

    Ibatis的配置文件`sqlmapConfig.xml`包含了数据源、事务管理器、SqlSessionFactory等核心设置。在Java代码中,可以使用如下的方式加载配置文件: ```java String resource = ...

    DAO-2.3.4.726

    4. **事务管理**:DAO层通常负责事务的开启、提交和回滚。在iBATIS中,可以通过配置或者编程方式来管理事务,确保数据的一致性。 5. **接口驱动编程**:iBATIS鼓励使用接口驱动的编程模型,开发者定义DAO接口,然后...

Global site tag (gtag.js) - Google Analytics