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

shiaisun 2013-04-03

Atomikos数据源配置方法有三种

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

Simple表示基础数据库连接配置
     <bean id="oracleJta" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">   
        <property name="uniqueResourceName">   
            <value>OracleXADataSource</value>   <!--任意命名,但必须唯一-->
        </property>   
        <property name="xaDataSourceClassName">   
            <value>oracle.jdbc.xa.client.OracleXADataSource</value>   
        </property>   
        <property name="xaDataSourceProperties">   
            <value>URL=jdbc:oracle:thin:@localhost:1521:orcl;user=orcl;password=</value>   
        </property>   
        <property name="exclusiveConnectionMode">   
            <value>true</value>   
        </property>   
        <property name="connectionPoolSize">   
            <value>3</value>   
        </property>   
        <property name="validatingQuery">   
            <value>SELECT 1</value>   
        </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>OracleXADataSource</value>  
        </property>  
        <property name="xaDataSourceClassName">  
            <value>oracle.jdbc.xa.client.OracleXADataSource</value>  
        </property>
        <property name="xaProperties">  
            <props>  
                     <prop key="URL">jdbc:oracle:thin:@localhost:1521:orcl</prop>  
                <prop key="user">orcl</prop>  
                <prop key="password"></prop>  
            </props>  
        </property>  
          <property name="poolSize"><value>1</value></property>    
          <property name="maxPoolSize"><value>30</value></property>        
    </bean>     
    AtomikosNon表示必须要用到普通数据库驱动类,可设置连接池       
    <bean id="oracleJta" class="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean">
        <property name="uniqueResourceName"><value>OracleXADataSource</value></property>
        <property name="user"><value>orcl</value></property>
        <property name="password"><value></value></property>
        <property name="url"><value>jdbc:oracle:thin:@192.168.1.217:1521:orcl</value></property>
        <property name="driverClassName"><value>oracle.jdbc.OracleDriver</value></property>
        <property name="poolSize"><value>1</value></property>
        <property name="borrowConnectionTimeout"><value>60</value></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>true</value>  
        </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 代码
<!-- 第一个数据库 -->  
    <bean id="dataSource" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">  
        <property name="uniqueResourceName">  
            <value>mysql/main</value>  
        </property>  
        <property name="xaDataSourceClassName">  
            <!-- 使用Mysql XADataSource(mysql>=5.0, Connector/J>=5.0才可以支持XADatasource)-->  
            <value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>  
        </property>  
        <property name="xaDataSourceProperties">  
            <value>URL=${jdbc.url};user=${jdbc.username};password=${jdbc.password}</value>  
        </property>  
        <property name="exclusiveConnectionMode">  
            <value>true</value>  
        </property>  
        <property name="connectionPoolSize">  
            <value>3</value>  
        </property>  
        <property name="validatingQuery">  
            <value>SELECT 1</value>  
        </property>  
    </bean>  
    <!-- 第二个数据库 -->  
    <bean id="dataSourceB" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">  
        <property name="uniqueResourceName">  
            <value>mysql/news</value>  
        </property>  
        <property name="xaDataSourceClassName">  
            <!-- 使用Mysql XADataSource(mysql>=5.0, Connector/J>=5.0才可以支持XADatasource)-->  
            <value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>  
        </property>  
        <property name="xaDataSourceProperties">  
            <value>URL=${jdbc.url.b};user=${jdbc.username.b};password=${jdbc.password.b}</value>  
        </property>  
        <property name="exclusiveConnectionMode">  
            <value>true</value>  
        </property>  
        <property name="connectionPoolSize">  
            <value>3</value>  
        </property>  
        <property name="validatingQuery">  
            <value>SELECT 1</value>  
        </property>  
    </bean>  

相关推荐