现在的位置: 首页 > 综合 > 正文

JDBC分层事务管理机制

2013年08月21日 ⁄ 综合 ⁄ 共 2573字 ⁄ 字号 评论关闭

 

虽然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);//将数据库操作实例添加到事务控制器

抱歉!评论已关闭.