iBATIS DAO事务管理实现
iBATIS DAO事务管理组件不但要管理事务连接池,同时也要管理多个ORM的事务处理。iBATIS DAO框架重要的因素之一是它全面的事务支持。iBATIS DAO框架是对通用事务管理的一个包装,向开发人员提供了一致的事务管理抽象。iBATIS DAO目前支持如下7种实现事务的管理框架:JDBC、Apache Ojb、Toplink、JTA、SQLMap、Hibernate和EXTERNAL事务。
JDBC的事务管理器:用DataSource API实现连接池服务。现阶段支持三种DataSource,分别为Simple、DBCP和JNDI。Simple是采用iBATIS自己实现的一个SimpleDataSource,其理想运行场所是对可靠性要求低并且比较独立的事务处理。DBCP是采用Jakarta DBCP的DataSource。JNDI事务是基于检索JNDI目录而生成的DataSource。
JTA事务管理器管理事务使用JTA的API来实现,实现模式与上述基本一致,还是要通过检索JNDI目录而生成的DataSource。但这个JTA事务管理器允许开发人员对UserTransaction实例进行控制。
SQLMap事务管理器基于iBATIS SQLMap框架平台的事务处理。iBATIS DAO事务管理在此只
起到一个二传手的作用。Hibernate事务管理器、Apache Ojb事务管理器和Toplink事务管理器基本与SQLMap事务管理器类似,都是转移给相关平台的事务管理来进行处理的。
1.iBATIS DAO事务管理的实现和配置
DAO本身是没有进行事务处理的。在事务处理方面,DAO充当了一个二传手。它把事务处理都转移给各个持久层来进行控制,实现二传手的工具就是DaoContext。DAO所有的事务处理都提交到DaoContext接口方法,然后DaoContext接口通过调用持久层接口的相应方法来实现。
2.DAO事务管理的结构说明
iBATIS DAO框架提供了事务管理模块。而这个事务管理可以应用到很多场合,包括JDBC、Hibernate、JTA、SQLMap等。其中JtaDaoTransaction类、JdbcDaoTransaction类、SqlMapDaoTransaction类和HibernateDaoTransaction类实现ConnectionDaoTransaction接口。ConnectionDaoTransaction接口继承DaoTransaction接口。而OjbBrokerDaoTransaction类和ToplinkDaoTransaction类直接实现DaoTransaction接口。Ojb
BrokerTransactionManager类、JtaDaoTransactionManager类、JdbcDaoTransactionManager类、HibernateDaoTransaction Manager类、SqlMapDaoTransactionManager类、ToplinkDaoTransactionManager类实现DaoTransactionManager接口。具体的类结构图如图4-15所示。
DaoTransactionManager接口和DaoTransactionDao接口的关系很奇特。TransactionManager接口只是依赖DaoTransaction接口,两者并没有建立关联。但是,这种依赖关系可以等同于一种关联关系,即DaoTransactionManager接口只有在DaoTransaction接口实现的条件下,才能进行正常的工作。这种依赖就好像一个桥梁,把DaoTransactionManager接口和DaoTransaction关联了起来。
深层次地抽象两者关系,这其实是一种变形的桥梁模式。也就是说,我们可以用桥梁模式的思路去理解这种结构模式。桥梁(Bridge)模式属于结构型设计模式。它将有关联的两个事务的抽象化与实现化脱耦,使得两者可以独立地变化,也就是说,将它们之间的强关联变成弱关联,是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立地变化。
图4-15 iBATIS DAO事务管理类结构图 |
Bridge结构如图4-16所示。Bridge角包括抽象化(Abstraction)角、修正抽象化(Refine Abstraction)角、实现化(Implementor)角和具体实现化(Concrete Implementor)角。
图4-16 Bridge设计模式结构 |
① 抽象化(Abstraction)角:Abstraction定义抽象类的接口。维护一个指向Implemcntor类型对象的指针。抽象化(Abstraction)角可以是接口,也可以是抽象类。属于不可缺少角。
② 修正抽象化(Refine Abstraction)角:RefinedAbstraction扩充由Abstraction定义的接口 Implementor定义实现类的接口。该接口不一定要与Abstraction的接口完全一致。
③ 实现化(Implementor)角:lmplementor接口仅提供基本操作。这个抽象类规范具体实现化角,规定出具体实现化角当有的(非私有)方法和属性。实现化(Implementor)角可以是接口,也可以是抽象类,属于不可缺少角。
④ 具体实现化(Concrete Implementor)角:Concreteimplementor实现Implementor接口并定义它的具体实现。
针对iBATIS DAO框架的事务结构模式,DaoTransactionManager接口是抽象化(Abstraction)角,SqlMapDaoTransactionManager类、OjbBrokerTransactionManager类、JtaDaoTransactionManager类、ExternalDaoTransactionManager类、ToplinkDaoTransaction Manager类、JdbcDaoTransactionManager类和HibernateDaoTransactionManager类等是修正抽象化(Refine Abstraction)角。DaoTransaction接口是实现化(Implementor)角,JtaDaoTransaction类、SqlMapDaoTransaction类、jdbc连接oracleHibernateDaoTransaction类、JdbcDao Transaction类、OjbBro
kerDaoTransaction类、ExternalDaoTransaction类和ToplinkDao Transaction类是具体实现化(Concrete Implementor)角。
该桥梁模式实现的内容就是支持多种事务处理模式,如SQLMap、Apache Ojb、JTA、Toplink、JDBC、Hibernate和External方式。当在配置文件中定义哪一种模式,就实现那种模式的事务处理。
iBATIS DAO框架要集成JDBC、JTA、Hibernate、Apache Obj、TopLink、SQLMap的事务框架,首先要实现iBATIS DAO中DaoTransactionManager的方法。
1. public void configure(Properties properties);
2. public DaoTransaction startTransaction();
3. public void commitTransaction(DaoTransaction trans);
4. public void rollbackTransaction(DaoTransaction trans);
同时,在实现这些方法的同时,会创建不同的DaoTransaction实例化对象。由于DaoTransa
ction本身并没有接口方法,所以,主要还是通过DaoTransactionManager实例化对象的方法来实现。
下面就分别针对iBATIS DAO框架的JDBC、JTA、Hibernate、Apache Obj、TopLink、SQLMap的事务实现模式进行详细说明。
3.iBATIS DAO框架的JDBC事务实现
基于JDBC的数据库操作中,一项事务是由一条或是多条表达式所组成的一个不可分割的工作单元。关于事务操作的方法都位于接口java. sql.Connection中。我们通过调用Connection的commit方法来提交事务,用调用rollback方法来回滚或结束事务。一般情况下,JDBC的事务操作默认是自动提交。也就是说,一条对数据库的更新表达式代表一项事务操作,操作成功后,系统将自动调用commit来提交,否则将调用rollback来回滚。但是可以通过调用Connection的setAutoCommit(false)来禁止自动提交。之后就可以把多个数据库操作的表达式作为一个事务,在操作完成后调用commit来进行整体提交,倘若其中一个表达式操作失败,都不会执行到commit,并且将产生响应的异常;此时就可以在异常捕获时调用rollback进行回滚。这样做可以保持多次更新操作后,相关数据的一致性,代码示例如下:
1. ...
2. try {
3. conn = DriverManager.getConnection(jdbc:oracle:thin:@host:1521:SID; username;, userpwd);
4. conn.setAutoCommit(false);//禁止自动提交,设置回滚点
5. stmt = conn.createStatement();
6. &uteUpdate(“alter table …”); //数据库更新操作1
7. &uteUpdate(“insert into table …”); //数据库更新操作2
8. connmit(); //事务提交
9. }catch(Exception ex) {
10. ex.printStackTrace();
11. try {
12. llback(); //操作不成功则回滚
13. }catch(Exception e) {
14. e.printStackTrace();
15. }
16. }
iBATIS DAO JDBC组件还包含了JDBC的Connection等内容,总共由5个接口,5个类组成。其中DaoTransaction接口、DaoTransactionManager接口和ConnectionDaoTransaction接口是通用接口,也是外部调用的API接口。JdbcDaoTransactionManager类实现DaoTransactionManager接口并关联JDBC的DataSource接口,同时它也依赖JdbcDaoTransaction类。JdbcDaoTransaction类实现ConnectionDaoTransaction接口(该接
口继承DaoTransaction接口)并关联JDBC的Connection接口。具体类结构如图4-17所示。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论