• 使用Atomikos Transactions Essentials实现多数据源JTA分布式事务


    使用Atomikos Transactions Essentials实现多数据源JTA分布式事务

    最近做的project中遇到要将数据库中的表分布到两台不同的服务器上的Mysql5.0中,project主要使用spring ibatis。因此需要JTA的支持,但是tomcat不支持,所以就搜索开源的JTA实现。 最开始使用的是JOTM,但是使用中不能自动rollback,无论什么情况都commit。然后看到infoq上一篇文章提到Atomikos Transactions Essentials,Atomikos Transactions Essentials 3.0是Atomikos 开发的核心事务引擎,支持JDBC 以及JMS 的JTA/XA 事务。易于部署,轻量级,同时支持JDBC 以及JMS 。 Atomikos Transactions Essentials现在的版本是3.1.7,可以在http://www.atomikos.com/home.html下载,在发布包里的examples文件夹下面有些例子,非常实用,我在使用中参考里面的例子很容易配置成功。先将发布包里面dist目录下的 atomikos-util.jar,transactions.jar,transactions-api.jar,transactions- jta.jar copy到项目lib里面,如果使用hibernate则需要将另外两个hibernate相关的jar页copy到项目里面,spring配置文件如下:

    xml 代码
     
    1. <!-- 第一个数据库 --> 
    2. <beanid="dataSource"class="com.atomikos.jdbc.SimpleDataSourceBean"init-method="init"destroy-method="close"> 
    3.     <propertyname="uniqueResourceName"> 
    4.         <value>mysql/main</value> 
    5.     </property> 
    6.     <propertyname="xaDataSourceClassName"> 
    7.         <!-- 使用Mysql XADataSource(mysql>=5.0, Connector/J>=5.0才可以支持XADatasource)--> 
    8.         <value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value> 
    9.     </property> 
    10.     <propertyname="xaDataSourceProperties"> 
    11.         <value>URL=${jdbc.url};user=${jdbc.username};password=${jdbc.password}</value> 
    12.     </property> 
    13.     <propertyname="exclusiveConnectionMode"> 
    14.         <value>true</value> 
    15.     </property> 
    16.     <propertyname="connectionPoolSize"> 
    17.         <value>3</value> 
    18.     </property> 
    19.     <propertyname="validatingQuery"> 
    20.         <value>SELECT 1</value> 
    21.     </property> 
    22. </bean> 
    23. <!-- 第二个数据库 --> 
    24. <beanid="dataSourceB"class="com.atomikos.jdbc.SimpleDataSourceBean"init-method="init"destroy-method="close"> 
    25.     <propertyname="uniqueResourceName"> 
    26.         <value>mysql/news</value> 
    27.     </property> 
    28.     <propertyname="xaDataSourceClassName"> 
    29.         <!-- 使用Mysql XADataSource(mysql>=5.0, Connector/J>=5.0才可以支持XADatasource)--> 
    30.         <value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value> 
    31.     </property> 
    32.     <propertyname="xaDataSourceProperties"> 
    33.         <value>URL=${jdbc.url.b};user=${jdbc.username.b};password=${jdbc.password.b}</value> 
    34.     </property> 
    35.     <propertyname="exclusiveConnectionMode"> 
    36.         <value>true</value> 
    37.     </property> 
    38.     <propertyname="connectionPoolSize"> 
    39.         <value>3</value> 
    40.     </property> 
    41.     <propertyname="validatingQuery"> 
    42.         <value>SELECT 1</value> 
    43.     </property> 
    44. </bean> 
    45.  
    46.  
    47. <beanid="lobHandler"class="org.springframework.jdbc.support.lob.DefaultLobHandler"/> 
    48.  
    49. <!-- 第一个数据库的sqlMapClient --> 
    50. <beanid="sqlMapClient"class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> 
    51.     <propertyname="configLocation"> 
    52.         <!-- 包含第一个数据库表的map --> 
    53.         <value>classpath:/sqlmap-config.xml</value> 
    54.     </property> 
    55.     <propertyname="dataSource"ref="dataSource"/> 
    56.     <propertyname="lobHandler"ref="lobHandler"/> 
    57. </bean> 
    58. <!-- 第二个数据库的sqlMapClient --> 
    59. <beanid="sqlMapClientB"class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> 
    60.     <propertyname="configLocation"> 
    61.         <!-- 包含第一个数据库表的map --> 
    62.         <value>classpath:/sqlmap-configb.xml</value> 
    63.     </property> 
    64.     <propertyname="dataSource"ref="dataSourceB"/> 
    65.     <propertyname="lobHandler"ref="lobHandler"/> 
    66. </bean> 
    67.  
    68. <!-- Construct Atomikos UserTransactionManager, needed to configure Spring --> 
    69. <beanid="atomikosTransactionManager"class="com.atomikos.icatch.jta.UserTransactionManager"init-method="init" 
    70.     destroy-method="close"> 
    71.     <!--  when close is called, should we force transactions to terminate or not? --> 
    72.     <propertyname="forceShutdown"> 
    73.         <value>true</value> 
    74.     </property> 
    75. </bean> 
    76.  
    77. <!-- Also use Atomikos UserTransactionImp, needed to configure Spring  --> 
    78. <beanid="atomikosUserTransaction"class="com.atomikos.icatch.jta.UserTransactionImp"> 
    79.     <propertyname="transactionTimeout"value="240"/> 
    80. </bean> 
    81.  
    82. <!-- Configure the Spring framework to use JTA transactions from Atomikos --> 
    83. <beanid="transactionManager"class="org.springframework.transaction.jta.JtaTransactionManager"> 
    84.     <propertyname="transactionManager"> 
    85.         <refbean="atomikosTransactionManager"/> 
    86.     </property> 
    87.     <propertyname="userTransaction"> 
    88.         <refbean="atomikosUserTransaction"/> 
    89.     </property> 
    90. </bean> 

    事务的配置, 使用了spring2.0的语法,所以将namesapce也帖出来了.

    xml 代码
     
    1. <?xmlversion="1.0"encoding="UTF-8"?> 
    2. <beansxmlns="http://www.springframework.org/schema/beans" 
    3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    4.        xmlns:aop="http://www.springframework.org/schema/aop" 
    5.        xmlns:tx="http://www.springframework.org/schema/tx" 
    6.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
    7.            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd 
    8.            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd" 
    9.        default-autowire="byName"default-lazy-init="true"> 
    10.     <!-- 支持 @AspectJ 标记--> 
    11.     <aop:aspectj-autoproxy/> 
    12.  
    13.     <aop:configproxy-target-class="true"> 
    14.         <aop:advisorpointcut="execution(* *Facade.*(..))"advice-ref="txAdvice"/> 
    15.         <aop:advisorpointcut="execution(* *Manager.*(..))"advice-ref="txAdvice"/> 
    16.     </aop:config> 
    17.  
    18.     <tx:adviceid="txAdvice"> 
    19.         <tx:attributes> 
    20.             <tx:methodname="get*"read-only="true"/> 
    21.             <tx:methodname="find*"read-only="true"/> 
    22.             <tx:methodname="has*"read-only="true"/> 
    23.             <tx:methodname="locate*"read-only="true"/> 
    24.             <tx:methodname="*"/> 
    25.         </tx:attributes> 
    26.     </tx:advice> 
    27. </beans> 

    这样配置以后就可以使用分布式事务,测试中出现异常时事务也自动提交。和JOTM相比Atomikos Transactions Essentials更加稳定,它原来是商业项目,现在开源了。象mysql一样卖服务支持的。而且论坛页比较活跃,有问题很快可以解决。

    使用XADatasource的数据源配置

    Java代码 复制代码
    1. <!-- 第一个数据库 -->  
    2.     <bean id="dataSource"class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">  
    3.         <property name="uniqueResourceName">  
    4.             <value>mysql/main</value>  
    5.         </property>  
    6.         <property name="xaDataSourceClassName">  
    7.             <!-- 使用Mysql XADataSource(mysql>=5.0, Connector/J>=5.0才可以支持XADatasource)-->  
    8.             <value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>  
    9.         </property>  
    10.         <property name="xaDataSourceProperties">  
    11.             <value>URL=${jdbc.url};user=${jdbc.username};password=${jdbc.password}</value>  
    12.         </property>  
    13.         <property name="exclusiveConnectionMode">  
    14.             <value>true</value>  
    15.         </property>  
    16.         <property name="connectionPoolSize">  
    17.             <value>3</value>  
    18.         </property>  
    19.         <property name="validatingQuery">  
    20.             <value>SELECT 1</value>  
    21.         </property>  
    22.     </bean>  
    23.     <!-- 第二个数据库 -->  
    24.     <bean id="dataSourceB"class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">  
    25.         <property name="uniqueResourceName">  
    26.             <value>mysql/news</value>  
    27.         </property>  
    28.         <property name="xaDataSourceClassName">  
    29.             <!-- 使用Mysql XADataSource(mysql>=5.0, Connector/J>=5.0才可以支持XADatasource)-->  
    30.             <value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>  
    31.         </property>  
    32.         <property name="xaDataSourceProperties">  
    33.             <value>URL=${jdbc.url.b};user=${jdbc.username.b};password=${jdbc.password.b}</value>  
    34.         </property>  
    35.         <property name="exclusiveConnectionMode">  
    36.             <value>true</value>  
    37.         </property>  
    38.         <property name="connectionPoolSize">  
    39.             <value>3</value>  
    40.         </property>  
    41.         <property name="validatingQuery">  
    42.             <value>SELECT 1</value>  
    43.         </property>  
    44.     </bean>
  • 相关阅读:
    文档测试
    浅谈兼容性测试
    配置测试
    测试产品说明书
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
    LeetCode
  • 原文地址:https://www.cnblogs.com/endsock/p/2468034.html
Copyright © 2020-2023  润新知