六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 273|回复: 0

在S2DAO例子程序基础上实现事务管理(JDBC中的事务管理,出错时进行回滚)

[复制链接]

升级  58.67%

36

主题

36

主题

36

主题

秀才

Rank: 2

积分
138
 楼主| 发表于 2013-1-30 01:40:53 | 显示全部楼层 |阅读模式
<!-- --><!-- --><!-- -->
要求能够不论BL的方法访问多少个DAO,一旦失败都能够回滚。
解决方案:在S2DAO例子程序基础上实现事务管理(JDBC中的事务管理,出错时进行回滚)
 
核心问题:只使用一个container(该容器内不仅可以装DAO,比如我们前面熟知的EmployeeDaoDepartmentDao;还可以装业务逻辑,比如HogeImpl类的foo方法)
 
核心配置文件HogeClient.dicon
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN""http://www.seasar.org/dtd/components24.dtd"> <components>     <include path="dao.dicon"/>       <include path="j2ee.dicon"/>             <component class="examples.dao.EmployeeDao ">              <aspect>dao.interceptor</aspect>       </component>       <component class="examples.dao.DepartmentDao ">              <aspect>dao.interceptor</aspect>       </component>          <component class="examples.tx.HogeImpl ">        <aspect>j2ee.requiredTx </aspect>    </component>   </components> 
 
测试类HogeClient.java:
package  examples.tx; import org.seasar.framework.container.S2Container;import org.seasar.framework.container.factory.S2ContainerFactory; import examples.dao.DepartmentDao;import examples.dao.EmployeeDao; public class HogeClient {        private static final String PATH = "examples/tx/HogeClient.dicon" ;        public static void main(String[] args) {              S2Container container = S2ContainerFactory.create ( PATH );              container.init();               HogeImpl hoge = (HogeImpl) container.getComponent(Hoge. class );               hoge.foo();        }} 
 
 
接口Hoge.java:
package  examples.tx; public interface Hoge {     public void foo();   }  

 
实现类HogeImpl.java:
package  examples.tx; import examples.dao.Department;import examples.dao.DepartmentDao;import examples.dao.Employee;import examples.dao.EmployeeDao; public class HogeImpl implements Hoge {             private EmployeeDao empDao ;       private DepartmentDao deptDao ;        public void setEmpDao(EmployeeDao empDao) {              this . empDao = empDao;       }        public void setDeptDao(DepartmentDao deptDao) {              this . deptDao = deptDao;       }        public void foo () {               try {                      //insert emp                     Employee emp = new Employee();                     emp.setEmpno( 1 );                     emp.setDeptno(10);                      empDao.insert(emp);                      System. out .println(emp);                      //insert dept                     Department dept = new Department();                     dept.setDeptno( 1 );                     dept.setDname( "foo" );                      deptDao.insert(dept);                      System. out .println(dept);               } finally {                     // container.destroy();              }       } } -》在实现类的foo方法中,有两段跟数据库打交道的操作,算是一个事务。(20090519追加)

 
备注:J2ee.dicon文件的配置请参考前面一篇blog
(对于requiredTx的配置原先就有,不用动它;注释掉默认的HSQL,使用PostgreSQL数据库)。
 
-》HSQL是一种内存数据库,PostgreSQL是实实在在的数据库。(20090519追加)
 
 
说明:这个实现综合了官网上事务的自动控制部分<!-- --><!-- --><!-- -->http://s2container.seasar.org/2.3/ja/tx.html
和下载的s2DAO示例程序。
 
首先自己在原先示例程序基础上再做个例子,合并两个dao的插入操作,然后将这段逻辑放入foo方法,在配置文件中对这个业务逻辑进行事务管理,从而实现了对两个dao的insert等操作进行事务处理。
 
对BL(Business Logic)层的事务处理测试结果:
在下面的情况下进行测试:2个dao的insert方法,在一个BL方法中先后执行,第一个insert成功,第二个insert失败。判断测试结果的方法是查看数据库表里的数据。
测试1:当不使用事务时,第一个表插入成功,第二个表插入失败。
测试2:当使用事务时,第一个表插入失败,第二个表插入失败。
 
结论:Dao和BL层对象从一个S2Container(DIContainer)中获取,对BL对象添加事务要求。
 
说明:实现思路和测试说明来源于部门首席技术专家!
 
 
<!-- --><!-- -->
<!-- -->
补充:
container.init();执行这句时,进行才初始化工作。
会调用setEmpDaosetDeptDao方法,将从容器中拿出的empDaodeptDao对象赋值给HogeImpl中的两个成员变量empDaodeptDao
 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表