JTA/XA: Atomikos + Spring + Hibernate 配置 注意事项

1. xaDataSource 配置如下. (DB2)

Xml代码   收藏代码
  1. <bean id="xaDataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean"   
  2. init-method="init" destroy-method="close">  
  3.         <!-- Set unique name for this datasource -->    
  4.         <property name="uniqueResourceName"><value>db2</value></property>  
  5.         <!-- Set XADatasource class name-->  
  6.         <property name="xaDataSourceClassName">  
  7.                  <value>com.ibm.db2.jcc.DB2XADataSource</value>  
  8.         </property>  
  9.         <property name="xaProperties">  
  10.                <props>  
  11.             <!-- Server name of DB2 server -->  
  12.                         <prop key="serverName">localhost</prop>  
  13.                         <!-- Port number of DB2 server -->  
  14.                         <prop key="portNumber">50000</prop>  
  15.                         <prop key="databaseName">myDb</prop>  
  16.                         <prop key="user"></prop>  
  17.                         <prop key="password"></prop>  
  18.                         <prop key="driverType">2</prop>  
  19. <!-- For DB2 data source,the dufault isolation level is TRANSACTION_READ_COMMITTED, -->  
  20. <!-- so we can comment out the line below -->  
  21.                         <!-- prop key="defaultIsolationLevel">2</prop-->          
  22.                </props>     
  23.          </property>  
  24.          <!-- set properties for datasource connection pool -->  
  25.          <property name="maxPoolSize"><value>10</value></property>  
  26.          <property name="minPoolSize"><value>2</value></property>  
  27.          <property name="loginTimeout"><value>30</value></property>  
  28.          <property name="reapTimeout"><value>20000</value></property>  
  29.          <!-- set a SQL for testing connection -->  
  30.          <property name="testQuery">  
  31.                         <value>select 1 from MyDb.table</value>  
  32.          </property>          
  33. </bean>  

配置xaDataSource的时候应注意设置 reapTimeout, 其他的可以用默认值.

com.atomikos.jdbc.AtomikosDataSourceBean 继承自 com.atomikos.jdbc.AbstractDataSourceBean

AbstractDataSourceBean 将 reapTimeout定义如下

Java代码   收藏代码
  1. /** 
  2.  * Sets the amount of time (in seconds) that the connection pool will allow a connection 
  3.  * to be in use, before claiming it back. Optional.  
  4.  *  
  5.  * @param reapTimeout The timeout in seconds. Zero means unlimited.  
  6.  *    Note that this value is only an indication;  
  7.  *    the pool will check regularly as indicated by the maintenanceInteval property. 
  8.  *    Default is 300 seconds (5 minutes). 
  9. */  
  10. public void setReapTimeout(int reapTimeout) {  
  11.     this.reapTimeout = reapTimeout;  
  12. }  

可以看到 reapTimeout 是管理 Connection 被占用的时间.

如果不设置这个值,Atomikos使用默认的5分钟,那么在处理大批量数据读取的时候,一旦超过5分钟,就会抛出类似 Resultset is close 的错误.

2. Transaction 配置如下   

Xml代码   收藏代码
  1. <bean id="atomikosTransactionManager"  
  2.        class="com.atomikos.icatch.jta.UserTransactionManager"   
  3.        init-method="init" destroy-method="close">  
  4.       <property name="forceShutdown">  
  5.                <value>true</value>  
  6.        </property>  
  7. </bean>  
  8. <!-- use com.atomikos.icatch.jta.UserTransactionImp as transaction, -->  
  9. <!-- "transactionTimeout" property should be change accord to product environment, -->  
  10. <!-- it defined in millisecond unit-->   
  11. <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">   
  12.        <property name="transactionTimeout">  
  13.              <value>20000</value>  
  14.        </property>  
  15. </bean>         
  16.   
  17. <!-- define JtaTransactionManager-->                
  18.  <bean id="interfaceTransactionManager"   
  19.             class="org.springframework.transaction.jta.JtaTransactionManager">  
  20.       <property name="transactionManager">  
  21.            <ref bean="atomikosTransactionManager" />  
  22.       </property>  
  23.       <property name="userTransaction">  
  24.            <ref bean="atomikosUserTransaction" />  
  25.       </property>  
  26.  </bean>         

配置 Atomikos 的 JtaTransaction 的时候需注意,  单这样配置, 这里的设置的 20000 秒有可能不会生效。
Atomikos 对它的Transaction Manager 有个宏观上的设置. 可以参考
http://www.atomikos.com/Documentation/JtaProperties 
注意 com.atomikos.icatch.max_timeout  这个参数. 他的作用是给所有的 Transaction 的 Timeout设置一个最大值(单位是毫秒),默认值是5分钟,如果小于它生效,如果大于它不生效(还是5分钟)。
所以,如果没有设置 com.atomikos.icatch.max_timeout    这个参数的话,设置20000秒是不会生效的.

如何设置 com.atomikos.icatch.max_timeout , 文档里面描述,部署一个 jta.properties 文件在 classpath的根目录下(bin目录),但是不同的atomikos可能不同,我部署的是 transactions.properties文件.

如何设置

Transactions.properties代码   收藏代码
  1. #Set the max timeout (in milliseconds) for local transactions  
  2. com.atomikos.icatch.max_timeout = 20000000  

 这样的话, atomikosUserTransaction 设置的 Timeout 20000 才能生效.

 

     Reference: http://www.atomikos.com/Documentation

 

     附: Atomikos 源码

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值