spring+mybatis+atomikos 實現JTA事務

atomikos支持一個分佈式事務,結合spring,能夠很好的知足一個應用訪問多個庫的須要。 java

atomikos 結合spring作配置也很簡單 mysql

1.配置datasource spring

<!-- 第一個數據庫 -->
	<bean id="dataSource" class="com.atomikos.jdbc.SimpleDataSourceBean"
		init-method="init" destroy-method="close">
		<property name="uniqueResourceName" value="mysql/main" />
		<property name="xaDataSourceClassName"
			value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" />
		<property name="xaDataSourceProperties"
			value="URL=${jdbc.url.a};user=${jdbc.username.a};password=${jdbc.password.a}" />
		<property name="exclusiveConnectionMode" value="true" />
		<property name="connectionPoolSize" value="10" />
		<property name="validatingQuery">
			<value>SELECT 1</value>
		</property>
	</bean>
	<!-- 第二個數據庫 -->
	<bean id="dataSourceB" class="com.atomikos.jdbc.SimpleDataSourceBean"
		init-method="init" destroy-method="close">
		<property name="uniqueResourceName" value="mysql/news" />
		<property name="xaDataSourceClassName"
			value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" />
		<property name="xaDataSourceProperties"
			value="URL=${jdbc.url.b};user=${jdbc.username.b};password=${jdbc.password.b}" />
		<property name="exclusiveConnectionMode" value="true" />
		<property name="connectionPoolSize" value="10" />
		<property name="validatingQuery">
			<value>SELECT 1</value>
		</property>
	</bean>
配置mybatis的SessionFactory


<bean id="sqlSessionFactoryB" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="configLocation" value="classpath:mybatis/mybatis-config-b.xml" />
		<property name="dataSource" ref="dataSourceB" />
	</bean>

	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="configLocation" value="classpath:mybatis/mybatis-config.xml" />
		<property name="dataSource" ref="dataSource" />
	</bean>

這裏使用的是SessionFactory,不是org.springframework.orm.ibatis.SqlMapClientFactoryBean,在mybatis3中用SqlMapClientFactoryBean彙報com.ibatis.common.xml.NodeletException 異常。 sql

configLocation 對應的mybatis配置,跟平時配置同樣。 shell

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<typeAliases>
		<typeAlias alias="User"  type="com.lantii.domain.User"/>
	</typeAliases>
	<mappers>
		<mapper resource="com/lantii/dao/UserMapper.xml" />
	</mappers>
</configuration>
事務這塊用spring管理atomikos

<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
		init-method="init" destroy-method="close">
		<property name="forceShutdown">
			<value>true</value>
		</property>
	</bean>

	<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
		<property name="transactionTimeout" value="300" />
	</bean>

	<bean id="springTransactionManager"
		class="org.springframework.transaction.jta.JtaTransactionManager">
		<property name="transactionManager">
			<ref bean="atomikosTransactionManager" />
		</property>
		<property name="userTransaction">
			<ref bean="atomikosUserTransaction" />
		</property>
	</bean>

	<aop:aspectj-autoproxy />

	<aop:config  proxy-target-class="true">
		<aop:advisor pointcut="execution(* *com.lantii.service..*(..))"
			advice-ref="txAdvice" />
	</aop:config>

	<tx:advice id="txAdvice" transaction-manager="springTransactionManager">
		<tx:attributes>
			<tx:method name="get*"  propagation="REQUIRED"  read-only="true" />
			<tx:method name="find*"  propagation="REQUIRED"  read-only="true" />
			<tx:method name="has*"  propagation="REQUIRED"  read-only="true" />
			<tx:method name="locate*"  propagation="REQUIRED"  read-only="true" />
			<tx:method name="*"  propagation="REQUIRED" rollback-for="Exception"  />
		</tx:attributes>
	</tx:advice>
Mapper的管理及注入

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
		<property name="sqlSessionFactory" ref="sqlSessionFactory" />
		<property name="mapperInterface" value="com.lantii.dao.UserMapper" />
	</bean>
	
	<bean id="roleMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
		<property name="sqlSessionFactory" ref="sqlSessionFactoryB" />
		<property name="mapperInterface" value="com.lantii.dao.RoleMapper" />
	</bean>

	<bean id="userService" class="com.lantii.service.UserServiceImpl">
		<property name="userMapper" ref="userMapper" />
		<property name="roleMapper" ref="roleMapper" />
	</bean>
atomikos的配置jta.properties,該文件放在應用classpath下面

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=WARN

這幾基本配置完畢,須要jar包 數據庫

atomikos-util.jar mybatis

transactions.jar app

transactions-jta.jar dom

transactions-jdbc-deprecated.jar 分佈式

mybatis.jar

mybatis-spring.jar

cglib.2.2.2.jar

spring的jar包

在Service中,調用事務的方法不能try。。。catch事務的方法,否者不能回滾

以下帶面就會出現不會滾問題

try{
    userMapper.addUser(user);
    roleMapper.addRole(role);
}catch(Exception){
				
}
固然也能夠不用mybatis,我的喜歡用Spring JdbcTemplate
相關文章
相關標籤/搜索