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


    一.以下介绍Spring中直接集成JOTM提供JTA事务管理、将JOTM集成到Tomcat中。 
    (经过测试JOTM在批量持久化时有BUG需要修改源码GenericPool类解决)! 
    参考文章http://mavin.zhou.blog.163.com/blog/static/114522435200971822334475/ 
    通过集成JOTM,直接在Spring中使用JTA事务 
    JOTM(Java Open Transaction Manager)是ObjectWeb的一个开源JTA实现,它本身也是开源应用程序服务器JOnAS(Java Open Application Server)的一部分,为其提供JTA分布式事务的功能。 
    Spring 2.0附带的依赖类库中虽然包含jotm类库,但是并不完整,你可以到http://jotm.objectweb.org下载完全版的JOTM。 
    Spring为JOTM提供了一个org.springframework.transaction.jta.JotmFactoryBean支持类,通过该支持类可以方便地创建JOTM本地实例。 
    1.将jotm的jar包lib目录下所有jar复制到项目中 
    2.将jotm的jar包conf目录下carol.properties文件复制到项目类路径下,修改内容为: 

    Xml代码  收藏代码
    1. # do not use CAROL JNDI wrapper        
    2. carol.start.jndi=false        
    3.         
    4. # do not start a name server        
    5. carol.start.ns=false        
    6.         
    7. # Naming Factory     
    8. carol.jndi.java.naming.factory.url.pkgs=org.apache.naming  


    3.建立两个数据库,配置两个数据源 

    Xml代码  收藏代码
    1. <!-- XAPool配置,内部包含了一个XA数据源,对应相应的数据库 -->  
    2.   <bean id="mysqlJta" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">    
    3.   <!-- 内部XA数据源-->  
    4.        <property name="dataSource">   
    5.             <bean class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">    
    6.                 <property name="transactionManager" ref="jotm"/>    
    7.                 <property name="driverName" value="com.mysql.jdbc.Driver"/>    
    8.                 <property name="url" value="jdbc:MySQL://localhost:3309/test"/>   
    9.                 <property name="user" value="root"/>    
    10.                 <property name="password" value=""/>    
    11.             </bean>    
    12.         </property>    
    13.         <property name="user" value="root"/>    
    14.         <property name="password" value=""/>    
    15.     </bean>    
    16.   
    17.   <bean id="oracleJta" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">    
    18.        <property name="dataSource">   
    19.             <bean class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">    
    20.                 <property name="transactionManager" ref="jotm"/>    
    21.                 <property name="driverName" value="oracle.jdbc.driver.OracleDriver"/>    
    22.                 <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>    
    23.                 <property name="user" value="orcl"/>    
    24.                 <property name="password" value=""/>                     
    25.             </bean>    
    26.         </property>    
    27.         <property name="user" value="orcl"/>    
    28.         <property name="password" value=""/>    
    29.     </bean>   

    4.事务配置 

    Xml代码  收藏代码
    1. <!-- JOTM本地实例 -->  
    2. <bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean" />      
    3.   
    4. <!-- JTA事务管理器 -->  
    5. <bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager">  
    6.     <property name="userTransaction" ref="jotm"/>  
    7. </bean>     
    8.   
    9. <!-- JTA事务传播特性 -->  
    10. <tx:advice id="txAdviceJta" transaction-manager="txManager">  
    11.     <tx:attributes>  
    12.         <tx:method name="Jta*"     isolation="DEFAULT" propagation="REQUIRED" rollback-for="Exception"/>  
    13.         <tx:method name="*" read-only="true"/>   
    14.     </tx:attributes>  
    15. </tx:advice>  
    16.   
    17. <aop:config>  
    18.     <aop:advisor pointcut="execution(* com.xxxxl.service.impl..*(..))"   advice-ref="txAdviceJta" />  
    19. </aop:config>  
    20.   
    21. <bean id="timerDaoMysql" class="com.xxxxl.TimerDaoImpl" scope="prototype">  
    22.     <property name="dataSource" ref="mysqlJta"></property>  
    23. </bean>  
    24. <bean id="timerDaoOracle" class="com.xxxxl.TimerDaoImpl" scope="prototype">  
    25.     <property name="dataSource" ref="oracleJta"></property>  
    26. </bean>  


    二.以下介绍Spring中直接集成Atomikos提供JTA事务管理、将Atomikos集成到Tomcat中。(经过测试推荐此方法) 
    Atomikos Transactions Essentials现在的版本是3.1.7,可以在http://www.atomikos.com/Main/TransactionsEssentialsDownloadForm 下载,在发布包里的examples文件夹下面有些例子,非常实用,我在使用中参考里面的例子很容易配置成功。1.将Atomikos的jar包dist目录下所有jar复制到项目中 
    2.建立两个数据库,配置两个数据源。 
    Atomikos数据源配置方法有三种分别有:SimpleDataSourceBean,AtomikosDataSourceBean,AtomikosNonXADataSourceBean可任选一种 

    Xml代码  收藏代码
    1. <!-- Simple表示基础数据库连接配置 -->  
    2.  <bean id="oracleJta" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">     
    3.        <property name="uniqueResourceName">     
    4.            <value>OracleXADataSource</value>   <!--任意命名,但必须唯一-->  
    5.        </property>     
    6.        <property name="xaDataSourceClassName">     
    7.            <value>oracle.jdbc.xa.client.OracleXADataSource</value>     
    8.        </property>     
    9.        <property name="xaDataSourceProperties">     
    10.            <value>URL=jdbc:oracle:thin:@localhost:1521:orcl;user=orcl;password=</value>     
    11.        </property>     
    12.        <property name="exclusiveConnectionMode">     
    13.            <value>true</value>     
    14.        </property>     
    15.        <property name="connectionPoolSize">     
    16.            <value>3</value>     
    17.        </property>     
    18.        <property name="validatingQuery">     
    19.            <value>SELECT 1</value>     
    20.        </property>     
    21.    </bean>     
    22.    <!-- Atomikos表示必须要用到XA数据库驱动类,可设置连接池(经过测试推荐此方法) -->  
    23. <bean id="oracleJta" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close" lazy-init="true">    
    24.        <property name="uniqueResourceName">    
    25.            <value>OracleXADataSource</value>    
    26.        </property>    
    27.        <property name="xaDataSourceClassName">    
    28.            <value>oracle.jdbc.xa.client.OracleXADataSource</value>    
    29.        </property>  
    30.        <property name="xaProperties">    
    31.            <props>    
    32.                  <prop key="URL">jdbc:oracle:thin:@localhost:1521:orcl</prop>    
    33.                <prop key="user">orcl</prop>    
    34.                <prop key="password"></prop>    
    35.            </props>    
    36.        </property>    
    37.       <property name="poolSize"><value>1</value></property>      
    38.       <property name="maxPoolSize"><value>30</value></property>  
    39.          <property name="testQuery" value="SELECT 1 from dual"/>  <!--解决偶尔失去连接的bug-->        
    40.    </bean>      
    41.    <!-- AtomikosNon表示必须要用到普通数据库驱动类,可设置连接池 -->         
    42. <bean id="oracleJta" class="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean">  
    43.     <property name="uniqueResourceName"><value>OracleXADataSource</value></property>  
    44.     <property name="user"><value>orcl</value></property>  
    45.     <property name="password"><value></value></property>  
    46.     <property name="url"><value>jdbc:oracle:thin:@192.168.1.217:1521:orcl</value></property>  
    47.     <property name="driverClassName"><value>oracle.jdbc.OracleDriver</value></property>  
    48.     <property name="poolSize"><value>1</value></property>  
    49.     <property name="borrowConnectionTimeout"><value>60</value></property>  
    50. </bean>     
    51. 另外一个数据库在这就不在写了,设置同上只是mysql的驱动类名为:xaDataSourceClassName:com.mysql.jdbc.jdbc2.optional.MysqlXADataSource   


    3.事务配置 

    Xml代码  收藏代码
      1. <!-- Atomikos事务方法 -->        
      2.    <bean id="atomikosTransactionManager"    
      3.        class="com.atomikos.icatch.jta.UserTransactionManager"    
      4.        init-method="init" destroy-method="close">    
      5.        <property name="forceShutdown">    
      6.            <value>true</value>    
      7.        </property>    
      8.    </bean>    
      9.    <bean id="atomikosUserTransaction"    
      10.        class="com.atomikos.icatch.jta.UserTransactionImp">    
      11.        <property name="transactionTimeout" value="240" />    
      12.    </bean>    
      13.    <bean id="transactionManager"    
      14.        class="org.springframework.transaction.jta.JtaTransactionManager">    
      15.        <property name="transactionManager">    
      16.            <ref bean="atomikosTransactionManager" />    
      17.        </property>    
      18.        <property name="userTransaction">    
      19.            <ref bean="atomikosUserTransaction" />    
      20.        </property>    
      21.    </bean>   
      22. 接下来的代码和上例类同就不再写。  
  • 相关阅读:
    交互式shell和非交互式shell、登录shell和非登录shell的区别
    cocos2d-x入门笔记(1)
    《你的知识需要管理》读后感悟以及笔记
    Qt入门之信号与槽机制
    《程序员的思维修炼》读书笔记以及感悟
    Py邮件
    2018-2019 20165226 Exp9 Web安全基础
    2018-2019 20165226 Exp 8 Web基础
    2018-2019 20165226 Exp7 网络欺诈防范
    2018-2019 20165226 Exp6 信息搜集与漏洞扫描
  • 原文地址:https://www.cnblogs.com/xingzc/p/5746737.html
Copyright © 2020-2023  润新知