![]() |
|
||||||||||||||
| | 网站首页 | 数据库教程 | web编程 | 服务器 | 程序设计 | | ||
|
||
|
||||||
| JDBC分层事务管理机制 | ||||||
作者:佚名 文章来源:不详 点击数: 更新时间:2007-9-2 ![]() |
||||||
|
文/李智慧 虽然ORM框架在J2EE应用中大行其道,但是使用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);//将数据库操作实例添加到事务控制器 } } 本文来源:http://blog.csdn.net/desertfish/archive/2007/07/09/1683655.aspx
|
||||||
| 文章录入:admin 责任编辑:admin | ||||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | ||||||
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 网站地图 | 管理登录 | | |||
|