JDBC分层事务管理机制

 文/李智慧

虽然ORM框架在J2EE应用中大行其道,但是使用JDBC直接访问数据库方式因其简单和强大而在许多时候对开发者极具诱惑力。尤其在复杂的多表关联集合操作的时候,ORM框架大多显得笨拙并且力不从心,而一条使用统计函数的sql语句却可以直接搞定。因此通常在我设计J2EE应用程序架构的时候会在持久层框架中保留两种访问数据库的方式――Hibernate和JDBC。
 
基于J2EE分层架构设计思想,数据访问层应该专门处理数据访问,而业务逻辑则在业务逻辑层中处理。为了提高复用,数据访问层对象(DAO)的粒度通常都非常小,一个更新操作被封装在一个方法中,这样当有多个更新操作需要被捆绑为一个事务的时候,事务的处理只能在业务逻辑层中实现。
 
在不分层的情况下,一个典型的JDBC事务处理代码片断如下。
try {
conn =DriverManager.getConnection   
("jdbc:oracle:thin:@host:1521:SID","username","userpwd";
conn.setAutoCommit(false);//禁止自动提交,设置回滚点
stmt = conn.createStatement();
stmt.executeUpdate(“alter table …”); //数据库更新操作1
stmt.executeUpdate(“insert into table …”); //数据库更新操作2
conn.commit(); //事务提交
}catch(Exception ex) {   
         ex.printStackTrace();
         try {
              conn.rollback(); //操作不成功则回滚
         }catch(Exception e) {
e.printStackTrace();
         }
}
 
分层的JDBC事务机制通过TransactionController和TransactionControllerFactory两个类来进行事务管理。数据访问层的更新操作都添加到TransanctionController中,在业务逻辑层中将事务commit。业务逻辑层和数据访问层通过TransactionControllerFactory来获得同一个事务控制器TransactionController。
 
事务控制器TransactionController接口代码
public interface TransactionController {
              public void add(DataAccessor da){} //将数据库操作的具体实现DataAccessor添加到事务控制器
 
              public int execute() throws SQLException{} //commit事务,如果异常,rollback。
}
 
事务控制器工厂TransactionControllerFactory实现类代码
public class TransactionControllerFactory{
              public static final ThreadLocal session = new ThreadLocal();
              /**
               * 启动TransactionController
               */
              public static TransactionController currentController() {
                            TransactionController ts = (TransactionController) session.get();
                            if (ts == null) {
                                          ts = new TransactionController ();
                                          session.set(ts);
                            }
                            return ts;
              }
              /**
               * 结束TransactionController
               */
              public static void closeController() {
                            session.remove();
              }
}
 
业务逻辑层代码举例
Test1Dao test1Dao = new DaoFacotory.getTest1Dao();
Test2Dao test1Dao = new DaoFacotory.getTest2Dao();
TransactionController tc = TransactionControllerFactory.currentController();
test1Dao.insertStaff (staff);
test2Dao.updateGroup(group)
tc.execute();
数据访问层代码举例
Public class Test1Dao{
Public void insertStaff(Staff staff){
        TransactionController tc = TransactionControllerFactory.currentController();
              DataAccessor da = DataAccessorFactory.getDataAccessor(…);//获取数据库操作实例DataAccessor
              da.setParameter(….);//设置DataAccessor参数
              tc.add(da);//将数据库操作实例添加到事务控制器
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值