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


    原文:http://www.ite/topic/122700

    9.17 update:使用NonXADataSourceBean. Mysql在5.0版本和Connecter/J5.0版本后提供了XADatasource支持,如果使用了支持XADatasouce版本,可以参考2楼补充. 

    最近做的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/Main/TransactionsEssentialsDownloadForm 下载,在发布包里的examples文件夹下面有些例子,非常实用,我在使用中参考里面的例子很容易配置成功。先将发布包里面dist目录下的atomikos-util.jar,transactions.jar,transactions-api.jar,transactions-jta.jar copy到项目lib里面, 如果使用hibernate则需要将另外两个hibernate相关的jar页copy到项目里面,spring配置文件如下:

    xml 代码
     
    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 >   
    45.   
    46.   
    47. bean   id = "lobHandler"   class = "org.springframework.jdbc.support.lob.DefaultLobHandler"   />   
    48.   
    49. <!-- 第一个数据库的sqlMapClient -->   
    50. bean   id = "sqlMapClient"   class = "org.springframework.orm.ibatis.SqlMapClientFactoryBean" >   
    51.     property   name = "configLocation" >   
    52.         <!-- 包含第一个数据库表的map -->   
    53.         value > classpath:/sqlmap-config.xml </ value >   
    54.     </ property >   
    55.     property   name = "dataSource"   ref = "dataSource"   />   
    56.     property   name = "lobHandler"   ref = "lobHandler"   />   
    57. </ bean >   
    58. <!-- 第二个数据库的sqlMapClient -->   
    59. bean   id = "sqlMapClientB"   class = "org.springframework.orm.ibatis.SqlMapClientFactoryBean" >   
    60.     property   name = "configLocation" >   
    61.         <!-- 包含第一个数据库表的map -->   
    62.         value > classpath:/sqlmap-configb.xml </ value >   
    63.     </ property >   
    64.     property   name = "dataSource"   ref = "dataSourceB"   />   
    65.     property   name = "lobHandler"   ref = "lobHandler"   />   
    66. </ bean >   
    67.   
    68. <!-- Construct Atomikos UserTransactionManager, needed to configure Spring -->   
    69. bean   id = "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.     property   name = "forceShutdown" >   
    73.         value > true </ value >   
    74.     </ property >   
    75. </ bean >   
    76.   
    77. <!-- Also use Atomikos UserTransactionImp, needed to configure Spring  -->   
    78. bean   id = "atomikosUserTransaction"   class = "com.atomikos.icatch.jta.UserTransactionImp" >   
    79.     property   name = "transactionTimeout"   value = "240"   />   
    80. </ bean >   
    81.   
    82. <!-- Configure the Spring framework to use JTA transactions from Atomikos -->   
    83. bean   id = "transactionManager"   class = "org.springframework.transaction.jta.JtaTransactionManager" >   
    84.     property   name = "transactionManager" >   
    85.         ref   bean = "atomikosTransactionManager"   />   
    86.     </ property >   
    87.     property   name = "userTransaction" >   
    88.         ref   bean = "atomikosUserTransaction"   />   
    89.     </ property >   
    90. </ bean >   



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

    xml 代码
     
    1. <? xml   version = "1.0"   encoding = "UTF-8" ?>   
    2. beans   xmlns = "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:config   proxy-target-class = "true" >   
    14.         aop:advisor   pointcut = "execution(* *Facade.*(..))"   advice-ref = "txAdvice" />   
    15.         aop:advisor   pointcut = "execution(* *Manager.*(..))"   advice-ref = "txAdvice" />   
    16.     </ aop:config >   
    17.   
    18.     tx:advice   id = "txAdvice" >   
    19.         tx:attributes >   
    20.             tx:method   name = "get*"   read-only = "true" />   
    21.             tx:method   name = "find*"   read-only = "true" />   
    22.             tx:method   name = "has*"   read-only = "true" />   
    23.             tx:method   name = "locate*"   read-only = "true" />   
    24.             tx:method   name = "*" />   
    25.         </ tx:attributes >   
    26.     </ tx:advice >   
    27. </ beans >   


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

  • 相关阅读:
    工具使用:Oracle数据库表转换为Mysql
    使用Spring框架下的完成对事务的操作
    使用Spring框架下的JdbcTemplate 完成对数据库的增删改查操作
    我的历程,从心开始
    验证码
    加载效果
    mybatis逆向工程
    lo4j配置文件
    springmvc拦截器
    如何在标题栏加入图标
  • 原文地址:https://www.cnblogs.com/davidwang456/p/4353209.html
Copyright © 2020-2023  润新知