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. 接下來的代碼和上例類同就再也不寫。  
相關文章
相關標籤/搜索