本项目需要使用atomikos这个JTA框架来进行对数据库的事务操作,首先是配置jta.properties文件,如下:
com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactorycom.atomikos.icatch.console_file_name = xx_jta.out com.atomikos.icatch.output_dir = ${catalina.base}/xx_xx/ com.atomikos.icatch.log_base_dir = ${catalina.base}/xx_log/ com.atomikos.icatch.log_base_name = xx_log com.atomikos.icatch.console_log_level=INFO 接着在spring的配置文件当中配置DataSource AtomikosDataSourceBean多数据库事务分布,如下:
<bean id="abstractXADataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close" abstract="true"> <property name="xaDataSourceClassName" value="${xaDataSourceClassName}"/> <property name="minPoolSize" value="${minPoolSize}"/> <property name="maxPoolSize" value="${maxPoolSize}"/> <property name="borrowConnectionTimeout" value="${borrowConnectionTimeout}"/> <property name="reapTimeout" value="${reapTimeout}"/> <property name="maxIdleTime" value="${maxIdleTime}"/> <property name="maintenanceInterval" value="${maintenanceInterval}"/> <property name="testQuery" value="${testQuery}"/> </bean><bean id="gameDataSource" parent="abstractXADataSource"> <property name="uniqueResourceName" value="${gameDataSource.uniqueResourceName}"/> <property name="xaProperties"> <props> <prop key="URL">${gameDataSource.URL}</prop> <prop key="user">${gameDataSource.user}</prop> <prop key="password">${gameDataSource.password}</prop> <prop key="noAccessToProcedureBodies">true</prop> </props> </property> </bean> <!-- Transaction --> <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close"> <!-- when close is called, should we force transactions to terminate or not? --> <property name="forceShutdown" value="true"/> </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="atomikosTransactionManager"/> <property name="userTransaction" ref="atomikosUserTransaction"/> <property name="transactionSynchronizationName" value="SYNCHRONIZATION_ON_ACTUAL_TRANSACTION"/> </bean> <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> <property name="transactionManager" ref="transactionManager"/> </bean> <bean class="com.game.dao.TransactionUtils"> <property name="transactionTemplate" ref="transactionTemplate"/> </bean> <!-- 配置注解 --> <tx:annotation-driven transaction-manager="transactionManager" /> 配置文件中需要用到的一些常量在properties文件中配置,如下:
xaDataSourceClassName = com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
minPoolSize=1
maxPoolSize=2
borrowConnectionTimeout=30
reapTimeout=20
maxIdleTime=60
maintenanceInterval=60
testQuery=select version()
gameDataSource.uniqueResourceName = mysql/gamedb
gameDataSource.URL=jdbc:mysql://192.168.x.x:3306/game_db?useUnicode=true&characterEncoding=utf-8
gameDataSource.user=xxx
gameDataSource.password=xxxxxx配置完成就可以使用atomikos的jta特性来对数据库的事务进行控制了。