`

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 class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
              <property name="locations">
                <list>
                  <value>dbconn.properties</value>
                  <!-- 这里可列出多个属性文件 -->
                </list>
              </property>  
            </bean>
            <!-- jotm实例,就是userTransaction(用户事务管理器) -->
            <bean id="jotm"  class="org.springframework.transaction.jta.JotmFactoryBean" />
            <!-- 
                注意这个org.springframework.transaction.jta.JotmFactoryBean类在Spring3中已经没有了,
                需要下载spring2.5.6的代码然后拷贝代码,再在工程中新建一个包,
                org.springframework.transaction.jta,然后创建JotmFactoryBean类.
            -->
            <!-- jta分布式事务管理器 -->
            <bean id="txManager"  class="org.springframework.transaction.jta.JtaTransactionManager">  
                <property name="userTransaction" ref="jotm" />  
            </bean>
            <!--mysql数据源-->  
            <bean id="mysqlDataSource" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">  
                <property name="dataSource">  
                   <bean class="org.enhydra.jdbc.standard.StandardXADataSource" 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" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">  
                <property name="dataSource">  
                   <bean class="org.enhydra.jdbc.standard.StandardXADataSource" 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

分享到:
评论

相关推荐

    spring + JTA + JOTM实现分布式事务

    spring + JTA + JOTM实现分布式事务, 高大上的技术

    Spring+JOTM 分布式事务管理

    简单易懂的JOTM实现分布式事务控制,此代码是maven项目,如果需要jar可以邮件给我,我发给你。

    JOTM配置分布式事务

    使用JOTM完成多数据源事务管理 在上一篇文档《Spring事务学习文档 》中,在最后我们说到了有两种方法来解决分布式事务,接下来,我们就简单说一下如何使用JOTM来管理分布式事务。

    Spring+Jotm+Hibernate+Oracle+Junit 实现JTA分布式事务要求Demo工程

    2.Spring+Jotm整合实现JTA分布式事务,应用场景如转账等,同一事务内完成db1用户加100元、db2用户减100元。 3.Spring+Junit4单元测试,优点:不会破坏数据库现场,等等。 (特别注意:Spring3.0里不在提供对jotm的...

    spring+jotm+ibatis+mysql实现JTA分布式事务

    代码下载下来,想要了解更多相关内容可以看http://www.cnblogs.com/shamo89/p/7307961.html

    JOTM简单测试DEMO(不含jar包)

    JOTM Spring分布式事务处理(多数据源) demo配置 JOTM Spring分布式事务处理(多数据源) demo配置

    Spring分布式事务实现

    JOTM使用包 博文链接:https://log-cd.iteye.com/blog/807607

    jta分布式事务完成例子,测试通过

    例子虽小,可覆盖面广,设计spring载入.properties文件,spring配置jta和jotm分布式事务,设置数据源连接池,注解事务驱动。功能是在mysql上建立了两个数据库分别为dbone和dbtwo,在dbone里有表tb1,表中只有一个字段...

    spring JTA集成JOTM或Atomikos配置分布式事务(Tomcat应用服务器)

    NULL 博文链接:https://zhaoshijie.iteye.com/blog/1836707

    spring 多数据源事务案例

    原先很多都是用jotm实现的,但是由于spring的升级,totm的本地化实例那个类已经找不到了,所以我使用了atomikos。 因为xa接口的事务开销比较大,在项目中如果全部使用分布式的话,那么开销也是很大的,所以在项目中...

    java开源包3

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包4

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包1

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包11

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包2

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包6

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包5

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包10

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包8

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包7

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

Global site tag (gtag.js) - Google Analytics