atomikosとMybatis分散トランザクション
本プロジェクトはmavenに基づいてspring,mybatisを用いてまずpom.xmlを導入する`
Spring-mybatis.xml構成データベースおよびトランザクション管理
データベース構成jdbc.properties
次に.メソッドまたはクラスに注釈を追加します.
テストしてもいいです
jta.propertiesの構成
プロジェクトの起動後、atomikosはログを生成し、ログファイルをロックし、プロジェクトを配置する際、同じtomcatまたはjettyでファイル名が同じにならないようにする.
<dependency>
<groupId>com.atomikos</groupId>
<artifactId>transactions-jdbc</artifactId>
<version>3.9.3</version>
</dependency>
<dependency>
<groupId>com.atomikos</groupId>
<artifactId>transactions-jta</artifactId>
<version>3.9.3</version>
</dependency>
<dependency>
<groupId>com.atomikos</groupId>
<artifactId>transactions</artifactId>
<version>3.9.3</version>
</dependency>
<dependency>
<groupId>com.atomikos</groupId>
<artifactId>transactions-api</artifactId>
<version>3.9.3</version>
</dependency>
<dependency>
<groupId>com.atomikos</groupId>
<artifactId>atomikos-util</artifactId>
<version>3.9.3</version>
</dependency>
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version></dependency>
Spring-mybatis.xml構成データベースおよびトランザクション管理
<!-- 2 dataSource, mysql -->
<bean id="dataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean"
init-method="init" destroy-method="close">
<property name="uniqueResourceName" value="ds1" />
<property name="xaDataSourceClassName"
value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" />
<property name="xaProperties">
<props>
<prop key="url">${dataSource1.url}</prop>
<prop key="user">${dataSource1.username}</prop>
<prop key="password">${dataSource1.password}</prop>
</props>
</property>
<property name="minPoolSize" value="${minPoolSize}" />
<property name="maxPoolSize" value="${maxPoolSize}" />
<property name="borrowConnectionTimeout" value="${borrowConnectionTimeout}" />
<property name="testQuery" value="select 1" />
<property name="maintenanceInterval" value="60" />
</bean>
<bean id="dataSource2" class="com.atomikos.jdbc.AtomikosDataSourceBean"
init-method="init" destroy-method="close">
<property name="uniqueResourceName" value="ds2" />
<property name="xaDataSourceClassName"
value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" />
<property name="xaProperties">
<props>
<prop key="url">${dataSource2.url}</prop>
<prop key="user">${dataSource2.username}</prop>
<prop key="password">${dataSource2.password}</prop>
</props>
</property>
<property name="minPoolSize" value="${minPoolSize}" />
<property name="maxPoolSize" value="${maxPoolSize}" />
<property name="borrowConnectionTimeout" value="${borrowConnectionTimeout}" />
<property name="testQuery" value="select 1" />
<property name="maintenanceInterval" value="60" />
</bean>
<!-- 2 sqlSessionFactory, mybatis mapper , mybatis -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath*:com/core/dao/impl/mysql/mapping/**/*.xml" />
<property name="typeAliasesPackage" value="com.core.entity,com.core.dto" />
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.core.dao.interfaces" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
<bean id="sqlSessionFactory2" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource2" />
<property name="mapperLocations" value="classpath*:com/core/dao2/impl/mysql/mapping/**/*.xml" />
<property name="typeAliasesPackage" value="com.core.entity2,com.core.dto2" />
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory2" />
<property name="basePackage" value="com.core.dao2.interfaces" />
</bean>
<!-- -->
<bean id="userTransactionService" class="com.atomikos.icatch.config.UserTransactionServiceImp"
init-method="init" destroy-method="shutdownForce">
<constructor-arg>
<props>
<prop key="com.atomikos.icatch.service">com.atomikos.icatch.standalone.UserTransactionServiceFactory
</prop>
</props>
</constructor-arg>
</bean>
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close" depends-on="userTransactionService">
<property name="forceShutdown" value="false" />
</bean>
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"
depends-on="userTransactionService">
<property name="transactionTimeout" value="300" />
</bean>
<bean id="jtaTransactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager"
depends-on="userTransactionService">
<property name="transactionManager" ref="atomikosTransactionManager" />
<property name="userTransaction" ref="atomikosUserTransaction" />
</bean>
<tx:annotation-driven transaction-manager="jtaTransactionManager" />
データベース構成jdbc.properties
dataSource1.driver=com.mysql.jdbc.Driver
dataSource1.url=jdbc:mysql://x.x.x.x:3306/db_mars?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=falsedataSource1.username=xxxxxx
dataSource1.password=xxxxxx
dataSource2.driver=com.mysql.jdbc.Driver
dataSource2.url=jdbc:mysql://x.x.x.x:3306/merchant?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=falsedataSource2.username=xxxx
dataSource2.password=xxxxx
次に.メソッドまたはクラスに注釈を追加します.
@Transactional(rollbackFor = Exception.class)
テストしてもいいです
@Override
public void Test() {
Member m=new Member();//BD1
m.setUserName("yyyyyyyyyyyyyyyy");
memberDao.insertSelective(m);//DB1
User e=new User();//DB2
e.setLoginName("yyyyyyyyyyyyyyyyyyy");
userDao.insertSelective(e);//DB2
User u=null;//
u.getId();
}
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.tmcom.atomikos.icatch.console_log_level = ERROR
`
プロジェクトの起動後、atomikosはログを生成し、ログファイルをロックし、プロジェクトを配置する際、同じtomcatまたはjettyでファイル名が同じにならないようにする.