首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Spring3 JOTM兑现分布式事务

2013-08-13 
Spring3 JOTM实现分布式事务Spring3 JOTM实现分布式事务?1. 创建web工程,将JOTM版本中lib下所有jar包拷贝

Spring3 JOTM实现分布式事务

Spring3 JOTM实现分布式事务

?

1. 创建web工程,将JOTM版本中lib下所有jar包拷贝到web-inf的lib下面

?

? ?相关准备工作参考:http://jackyin5918.iteye.com/blog/1922379

? ?主要包括:建数据库用户,建表,考jar包,拷贝tomcat 7jdbc pool的jar.

? ?配置carol.properties,放置到src目录下面.

? ?

?

2. spring分布式事务的相关配置

?

? ? 注意这个org.springframework.transaction.jta.JotmFactoryBean类在Spring3中已经没有了,

? ? ? ? ? ? ? ? 需要下载spring2.5.6(附件中有)的代码然后拷贝代码,再在工程中新建一个包,

? ? ? ? ? ? ? ? org.springframework.transaction.jta,然后创建JotmFactoryBean类.

? ? ? ? ? ? ? ??

?

? ? ? ? ? ??

<!-- 分布式 事务处理 开始.....-->            <!-- PropertyPlaceholderconfigure是一个Bean后处理器,它读取属性文件信息,                    并将这些信息设置为Spring配置文件元数据,这里用于读取数据库连接信息             -->            <bean  />            <!--                 注意这个org.springframework.transaction.jta.JotmFactoryBean类在Spring3中已经没有了,                需要下载spring2.5.6的代码然后拷贝代码,再在工程中新建一个包,                org.springframework.transaction.jta,然后创建JotmFactoryBean类.            -->            <!-- jta分布式事务管理器 -->            <bean id="txManager"  ref="jotm" />              </bean>            <!--mysql数据源-->              <bean id="mysqlDataSource" destroy-method="shutdown">                  <property name="dataSource">                     <bean destroy-method="shutdown">                         <property name="transactionManager" ref="jotm"/>                         <property name="driverName" value="${dbmysql.driverClassName}"/>                         <property name="url" value="${dbmysql.url}"/>                         <property name="user" value="${dbmysql.username}"/>                         <property name="password" value="${dbmysql.password}"/>                     </bean>                  </property>                  <!-- 这里必须额外再配置用户名和密码 -->                <property name="user" value="${dbmysql.username}"/>                  <property name="password" value="${dbmysql.password}"/>              </bean>            <!--oracle数据源-->              <bean id="oracleDataSource" destroy-method="shutdown">                  <property name="dataSource">                     <bean destroy-method="shutdown">                         <property name="transactionManager" ref="jotm"/>                         <property name="driverName" value="${dboracle.driverClassName}"/>                         <property name="url" value="${dboracle.url}"/>                         <property name="user" value="${dboracle.username}"/>                         <property name="password" value="${dboracle.password}"/>                     </bean>                  </property>                  <!-- 这里必须额外再配置用户名和密码 -->                <property name="user" value="${dboracle.username}"/>                  <property name="password" value="${dboracle.password}"/>              </bean>            <!-- 配置和mysql数据源管理的数据库操作模板 ,用于操作数据库-->            <bean id = "mysqlJdbcTpl" class = "org.springframework.jdbc.core.JdbcTemplate">                  <property name = "dataSource" ref="mysqlDataSource"/>               </bean>              <!-- 配置和oracle数据源管理的数据库操作模板,用于操作数据库 -->            <bean id = "oracleJdbcTpl" class = "org.springframework.jdbc.core.JdbcTemplate">                  <property name="dataSource" ref="oracleDataSource"/>               </bean>            <!-- 配置两个数据源的Dao,并注入 JDBC数据库操作模板JdbcTemplate-->            <bean id = "jtaDaoMysqlImp1" class = "test.spring.transaction.jta.JtaDaoMysqlImp1">                  <property name="jtp" ref="mysqlJdbcTpl"/>               </bean>            <bean id = "jtaDaoOracleImp1" class = "test.spring.transaction.jta.JtaDaoOracleImp1">                  <property name="jtp" ref="oracleJdbcTpl"/>               </bean>            <!-- 配置业务逻辑Bean,并注入相关的Dao组件 -->                <bean id = "businessBean" class = "test.spring.transaction.jta.BusinessDaoImp1">                  <property name="jtaDaoMysql" ref="jtaDaoMysqlImp1"/>               <property name="jtaDaoOracle" ref="jtaDaoOracleImp1"/>               </bean>                        <!-- 全局事务配置,主要是使用的transaction-manager不一样                配置增强处理的bean(相当于切面类),也是Spring自动生成普通                业务逻辑bean(targetBean)的代理Bean.里面的tx:method配置每个方法的事务属性,                name配置方法名,可使用通配符.           -->           <tx:advice id="txJpaAdvice" transaction-manager="txManager">              <!-- 配置详细的事务语义 -->              <tx:attributes>                <!-- 表示get开头的方法是只读的 -->                <tx:method name="get*" read-only="true" />                <!-- 其他方法使用默认的事务设置 -->                <tx:method name="*" />              </tx:attributes>           </tx:advice>                      <!-- 全局事务切面配置,AOP元素配置 -->           <aop:config>             <!--                  配置一个切入点 test.spring.transaction.jta包下面所有已Imp1结尾的类的所有方法,                  即BusinessDaoImp1的doBusinuss()方法             -->             <aop:pointcut id="myJpaPoint"                            expression="execution(* test.spring.transaction.jta.*Imp1.*(..))" />             <!-- 配置 (事务代理)切入点(aop:pointcut) 和 切面类(tx:advice),将二者关联起来  -->             <aop:advisor advice-ref="txJpaAdvice" pointcut-ref="myJpaPoint" />           </aop:config>                        <!-- 分布式 事务处理 结束-->

??

3. 测试.

? ?执行:test.spring.transaction.jta.TestSpringJTAClient类

? ?

? ?初始化:

? ?两个数据库的表都建立了唯一索引,保证数据不能重复插入,

? ?在mysql中插入一条数据oracle中没有数据.

? ?

? ?程序执行:

? ?调用businessDao.doBusinuss();分别往oracle和msyql中插入同一条数据(

? ?与mysql中已有数据重复)

? ?

? ?

? ?在织入全局事务AOP之前,因为oracle中没有数据,所以往oracle中插入数据正常,

? ?在mysql中插入数据报异常.程序执行完毕后,oracle中会被插入一条数据.

? ?

? ?而在织入全局事务AOP之后,mysql中插入数据异常导致全局事务回滚,

? ?这样,程序执行完毕后,oracle中仍然没有数据.

? ?

4. 尝试使用tomcat7的连接池代替XAPool连接池.

?

? ?需要替换 org.enhydra.jdbc.pool.StandardXAPoolDataSource和

? ?org.enhydra.jdbc.standard.StandardXADataSource

? ?

? ?还没搞定.不知道怎么配置,待研究...

? ?

? ?spring中使用 tomcat jdbc 连接池配置(局部事务,不支持全局事务的配置)

? ?http://weitd.iteye.com/blog/1497020

? ?

? ?

注:根据类名找jar包的 网站:

http://www.jarfinder.com/index.php/jars/versionInfo/66324

?

附件文件名 后缀 需要相应的修改为 001,002,003,004

热点排行