Spring+iBatis+Atomikos实现JTA事务

时间:2025-02-10 13:57:24
atomikos配合spring的使用方法: 

1、依赖包  
Atomikos的: 
transactions-jdbc 
transactions-jta 
transactions-api 
transactions 
atomikos-utils 
还有一个不要忘了,是jta的包。  
用maven要简单一点,只需要加入两个依赖: 
Xml代码 
  1. <dependency>  
  2.     <groupId></groupId>  
  3.     <artifactId>transactions-jdbc</artifactId>  
  4.     <version>3.7.0</version>  
  5. </dependency>  
  6. <dependency>  
  7.     <groupId></groupId>  
  8.     <artifactId>jta</artifactId>  
  9.     <version>1.1</version>  
  10. </dependency>  


2、配置数据源  
    这一步是比较重要的。要用AtomikosDataSourceBean,而不是以前用的连接池如dbcp。最好也用XA(这东西我还不太懂),注意jdbc的链接地址和登陆账号与普通连接池的配置的格式不一样。下面是一个mysql数据库的配置举例: 
Xml代码 
  1. <bean id="dataSource1" class="" init-method="init" destroy-method="close">  
  2.     <property name="uniqueResourceName" value="ds1"/>  
  3.     <property name="xaDataSourceClassName" value="."/>  
  4.     <property name="xaProperties">  
  5.         <props>  
  6.             <prop key="url">jdbc:mysql://localhost/test</prop>  
  7.             <prop key="user">test</prop>  
  8.             <prop key="password">test</prop>  
  9.         </props>  
  10.     </property>  
  11.     <property name="minPoolSize" value="10" />  
  12.     <property name="maxPoolSize" value="100" />  
  13.     <property name="borrowConnectionTimeout" value="30" />  
  14.     <property name="testQuery" value="select 1" />  
  15.     <property name="maintenanceInterval" value="60" />  
  16. </bean>  

再来一个sybase的配置举例: 
Xml代码 
  1. <bean id="dataSource2" class="" init-method="init" destroy-method="close">  
  2.     <property name="uniqueResourceName" value="ds2"/>  
  3.     <property name="xaDataSourceClassName" value="."/>  
  4.     <property name="xaProperties">  
  5.         <props>  
  6.             <prop key="serverName">192.168.1.10</prop>  
  7.                         <prop key="portNumber">2638</prop>  
  8.                         <prop key="databaseName">test</prop>  
  9.             <prop key="user">test</prop>  
  10.             <prop key="password">test</prop>  
  11.         </props>  
  12.     </property>  
  13.     <property name="minPoolSize" value="10" />  
  14.     <property name="maxPoolSize" value="100" />  
  15.     <property name="borrowConnectionTimeout" value="30" />  
  16.     <property name="testQuery" value="select 1" />  
  17.     <property name="maintenanceInterval" value="60" />  
  18. </bean>  


3、使用数据源  
    这一步与平时好像没什么不一样。我做例子的时候是用mybatis,配置如下: 
Xml代码 
  1. <bean id="sqlSessionFactory1" class="">  
  2.     <property name="dataSource" ref="dataSource1"/>  
  3. </bean>  
  4. <bean id="sqlSessionFactory2" class="">  
  5.     <property name="dataSource" ref="dataSource2"/>  
  6. </bean>  

当然,mybatis还要配置一下映射文件的自动扫描,这里与atomikos无关: 
Xml代码 
  1. <bean class="">  
  2.     <property name="basePackage" value=";" />  
  3.     <property name="sqlSessionFactory" ref="sqlSessionFactory1"/>  
  4. </bean>  
  5. <bean class="">  
  6.     <property name="basePackage" value=";" />  
  7.     <property name="sqlSessionFactory" ref="sqlSessionFactory2"/>  
  8. </bean>  

用spring JdbcTemplate应该与普通使用没什么不同,用hibernate可能会有点不一样,没测试过。 

4、配置jta事务管理  
    这是很关键的一步。原理我不太懂,例子如下: 
Xml代码 
  1. <bean id="transactionManager" class="">  
  2.     <property name="transactionManager">  
  3.         <bean class="" init-method="init" destroy-method="close">  
  4.             <property name="forceShutdown" value="true"/>  
  5.         </bean>  
  6.     </property>  
  7.     <property name="userTransaction">  
  8.         <bean class=""/>  
  9.     </property>  
  10. </bean>  

当然,用spring的声明式事务配置,再加上一行: 
Xml代码 
  1. <tx:annotation-driven/>  

(注意,本来要配置transaction-manager属性,如:<tx:annotation-driven  transaction-manager="transactionManager" />。这里没有配置是因为它的默认值是transactionManager) 

5、atomikos的配置文件  
    这个文件一般放在根路径吧,与类似。也可命名为。如果不配置这个文件,项目也能启动,因为几乎所有配置项都有默认值。最好还是配置了,详细配置信息请查看:/Documentation/JtaProperties。 

6、不管是用JdbcTemplate、mybatis还是hibernate,应该都可以写代码来测试了。。。