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

阅读更多

Atomikos数据源配置方法有三种

Atomikos数据源配置方法有三种分别有:SimpleDataSourceBean,AtomikosDataSourceBean,AtomikosNonXADataSourceBean可任选一种

 

    Simple表示基础数据库连接配置
     <bean id="oracleJta" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">   
        <property name="uniqueResourceName">   
            <value>OracleXADataSourcevalue>   
        property>   
        <property name="xaDataSourceClassName">   
            <value>oracle.jdbc.xa.client.OracleXADataSourcevalue>   
        property>   
        <property name="xaDataSourceProperties">   
            <value>URL=jdbc:oracle:thin:@localhost:1521:orcl;user=orcl;password=value>   
        property>   
        <property name="exclusiveConnectionMode">   
            <value>truevalue>   
        property>   
        <property name="connectionPoolSize">   
            <value>3value>   
        property>   
        <property name="validatingQuery">   
            <value>SELECT 1value>   
        property>   
    bean>   
    Atomikos表示必须要用到XA数据库驱动类,可设置连接池(经过测试推荐此方法)
    <bean id="oracleJta" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close" lazy-init="true">  
        <property name="uniqueResourceName">  
            <value>OracleXADataSourcevalue>  
        property>  
        <property name="xaDataSourceClassName">  
            <value>oracle.jdbc.xa.client.OracleXADataSourcevalue>  
        property>
        <property name="xaProperties">  
            <props>  
                     <prop key="URL">jdbc:oracle:thin:@localhost:1521:orclprop>  
                <prop key="user">orclprop>  
                <prop key="password">prop>  
            props>  
        property>  
          <property name="poolSize"><value>1value>property>    
          <property name="maxPoolSize"><value>30value>property>        
    bean>     
    AtomikosNon表示必须要用到普通数据库驱动类,可设置连接池       
    <bean id="oracleJta" class="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean">
        <property name="uniqueResourceName"><value>OracleXADataSourcevalue>property>
        <property name="user"><value>orclvalue>property>
        <property name="password"><value>value>property>
        <property name="url"><value>jdbc:oracle:thin:@192.168.1.217:1521:orclvalue>property>
        <property name="driverClassName"><value>oracle.jdbc.OracleDrivervalue>property>
        <property name="poolSize"><value>1value>property>
        <property name="borrowConnectionTimeout"><value>60value>property>
    bean>    
    另外一个数据库在这就不在写了,设置同上只是mysql的驱动类名为:xaDataSourceClassName:com.mysql.jdbc.jdbc2.optional.MysqlXADataSource 

 

3.事务配置

 

    Atomikos事务方法
    <bean id="atomikosTransactionManager"  
        class="com.atomikos.icatch.jta.UserTransactionManager"  
        init-method="init" destroy-method="close">  
        <property name="forceShutdown">  
            <value>truevalue>  
        property>  
    bean>  
    <bean id="atomikosUserTransaction"  
        class="com.atomikos.icatch.jta.UserTransactionImp">  
        <property name="transactionTimeout" value="240"/>  
    bean>  
    <bean id="transactionManager"  
        class="org.springframework.transaction.jta.JtaTransactionManager">  
        <property name="transactionManager">  
            <ref bean="atomikosTransactionManager"/>  
        property>  
        <property name="userTransaction">  
            <ref bean="atomikosUserTransaction"/>  
        property>  
    bean> 
    接下来的代码和上例类同就不再写。

最近做的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.            
  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.            
  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.    
  50. < bean   id = "sqlMapClient"   class = "org.springframework.orm.ibatis.SqlMapClientFactoryBean" >   
  51.     < property   name = "configLocation" >   
  52.            
  53.         < value > classpath:/sqlmap-config.xml  value >   
  54.      property >   
  55.     < property   name = "dataSource"   ref = "dataSource"   />   
  56.     < property   name = "lobHandler"   ref = "lobHandler"   />   
  57.  bean >   
  58.    
  59. < bean   id = "sqlMapClientB"   class = "org.springframework.orm.ibatis.SqlMapClientFactoryBean" >   
  60.     < property   name = "configLocation" >   
  61.            
  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.    
  69. < bean   id = "atomikosTransactionManager"   class = "com.atomikos.icatch.jta.UserTransactionManager"   init-method = "init"   
  70.     destroy-method = "close" >   
  71.        
  72.     < property   name = "forceShutdown" >   
  73.         < value > true  value >   
  74.      property >   
  75.  bean >   
  76.   
  77.    
  78. < bean   id = "atomikosUserTransaction"   class = "com.atomikos.icatch.jta.UserTransactionImp" >   
  79.     < property   name = "transactionTimeout"   value = "240"   />   
  80.  bean >   
  81.   
  82.    
  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.        
  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一样卖服务支持的。而且论坛页比较活跃,有问题很快可以解决。

使用XADatasource的数据源配置 
Java代码    收藏代码
  1.   
  2.     "dataSource" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">  
  3.         "uniqueResourceName">  
  4.             mysql/main  
  5.           
  6.         "xaDataSourceClassName">  
  7.               
  8.             com.mysql.jdbc.jdbc2.optional.MysqlXADataSource  
  9.           
  10.         "xaDataSourceProperties">  
  11.             URL=${jdbc.url};user=${jdbc.username};password=${jdbc.password}  
  12.           
  13.         "exclusiveConnectionMode">  
  14.             true  
  15.           
  16.         "connectionPoolSize">  
  17.             3  
  18.           
  19.         "validatingQuery">  
  20.             SELECT 1  
  21.           
  22.       
  23.       
  24.     "dataSourceB" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">  
  25.         "uniqueResourceName">  
  26.             mysql/news  
  27.           
  28.         "xaDataSourceClassName">  
  29.               
  30.             com.mysql.jdbc.jdbc2.optional.MysqlXADataSource  
  31.           
  32.         "xaDataSourceProperties">  
  33.             URL=${jdbc.url.b};user=${jdbc.username.b};password=${jdbc.password.b}  
  34.           
  35.         "exclusiveConnectionMode">  
  36.             true  
  37.           
  38.         "connectionPoolSize">  
  39.             3  
  40.           
  41.         "validatingQuery">  
  42.             SELECT 1  
  43.           
  44.       

你可能感兴趣的:(使用Atomikos Transactions Essentials实现多数据源JTA分布式事务)