Spring在tomcat下使用JTA事务
涉及到多个库的事务问题时,常常要使用到JTA事务,tomcat本身不支持JTA事务,需要借助于Atomikos来使用JTA事务。以下内容结合mybatis,在项目中配置JTA事务。
1,引入依赖
<dependency> <groupId>javax.transaction</groupId> <artifactId>jta</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>com.atomikos</groupId> <artifactId>transactions-jdbc</artifactId> <version>4.0.4</version> </dependency> |
2,引入properties配置,配置数据源
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:config.properties</value> </list> </property> </bean> |
配置数据源
<bean id="storeDS" class="com.atomikos.jdbc.AtomikosDataSourceBean" destroy-method="close"> <property name="uniqueResourceName" value="storeDS"/> <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"/> <property name="xaProperties"> <props> <prop key="url">${store_db.url}</prop> <prop key="user">${store_db.username}</prop> <prop key="password">${store_db.password}</prop> </props> </property> <property name="minPoolSize" value="5" /> <property name="maxPoolSize" value="20" /> <!-- 锁表时间 --> <property name="borrowConnectionTimeout" value="120" /> <property name="testQuery" value="select 1" /> <property name="maintenanceInterval" value="60" /> </bean>
<bean id="hanjudbDS" class="com.atomikos.jdbc.AtomikosDataSourceBean" destroy-method="close"> <property name="uniqueResourceName" value="hanjudbDS"/> <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"/> <property name="xaProperties"> <props> <prop key="url">${url}</prop> <prop key="user">${username}</prop> <prop key="password">${password}</prop> </props> </property> <property name="minPoolSize" value="10" /> <property name="maxPoolSize" value="40" /> <!-- 锁表时间 --> <property name="borrowConnectionTimeout" value="120" /> <property name="testQuery" value="select 1" /> <property name="maintenanceInterval" value="60" /> </bean> |
3,配置连接池,使用mybatis连接池
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="hanjudbDS" /> <property name="mapperLocations" value="classpath:com.ttt.server.dal.**.dao/**Dao.xml" /> </bean> <bean id="storeSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="storeDS" /> <property name="mapperLocations" value="classpath:com.ttt.server.dal.**.storedao/**StoreDao.xml" /> </bean> |
4,配置mybatis
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> <property name="basePackage" value="com.hanju.server.dal.**.dao" /> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSessionFactoryBeanName" value="storeSqlSessionFactory"/> <property name="basePackage" value="com.hanju.server.dal.**.storedao" /> </bean> |
5,配置事务
<!-- 引入spring注解事务 --> <tx:annotation-driven />
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManager"> <bean class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close"> <property name="forceShutdown" value="true"/> </bean> </property> <property name="userTransaction"> <bean class="com.atomikos.icatch.jta.UserTransactionImp"/> </property> </bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="get*" propagation="SUPPORTS" read-only="true" /> <tx:method name="find*" propagation="SUPPORTS" read-only="true" /> <tx:method name="check*" propagation="SUPPORTS" read-only="true" /> <tx:method name="is*" propagation="SUPPORTS" read-only="true" /> <tx:method name="search*" propagation="SUPPORTS" read-only="true" /> <tx:method name="select*" propagation="SUPPORTS" read-only="true" /> <tx:method name="*" propagation="REQUIRED" read-only="false" timeout="120" rollback-for="java.lang.Exception" /> </tx:attributes> </tx:advice>
<aop:config> <aop:pointcut expression="execution(* com.ttt.server..*Service.*(..)) and !@annotation(com.ttt.server.common.annotation.TTTNoTransaction)" id="txTransactionPC" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="txTransactionPC" /> </aop:config> |
6,classpath下增加jta.properties文件
com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory com.atomikos.icatch.console_file_name=tm.out com.atomikos.icatch.log_base_name=tmlog com.atomikos.icatch.tm_unique_name =com.atomikos.spring.jdbc.tm com.atomikos.icatch.console_log_level=INFO com.atomikos.icatch.max_actives=200 |