http://www.iteye.com/topic/1113929
最近弄一个框架,使用spring3.0.5+mybatis3.0.5,需要访问多库,要应用分布式事务JTA,这是用atomikos 3.70版本,并把配置做一下记录。
配置多个数据源
- <!-- 第一个数据库 -->
- <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 异常。
configLocation 对应的mybatis配置,跟平时配置一样。
- <?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
transactions.jar
transactions-jta.jar
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){
- }
相关推荐
NULL 博文链接:https://injavawetrust.iteye.com/blog/2308552
本用例基于 Spring Boot + Druid + Mybatis 配置多数据源,并采用 JTA 实现分布式事务。
springboot+Atomikos+jpa+mysql的JTA分布式事务实现,本案例涉及到2个数据库,预期结果,在同一个事务中,两个库的状态一致
NULL 博文链接:https://lizhao6210-126-com.iteye.com/blog/1958831
NULL 博文链接:https://onlyor.iteye.com/blog/1483289
atomikos的jar包,我这里也发表了一份Spring3.2+mybatis3.0+atomikos的jta系统搭建的博客,喜欢的朋友也可以支持一下。
Spring多数据源分布式事务管理/springmvc+spring+atomikos[jta]+druid+mybatis
SpringBoot集成Atomikos使用Oracle数据库mybatisSpringBoot集成Atomikos使用Oracle数据库mybatisSpringBoot集成Atomikos使用Oracle数据库mybatisSpringBoot集成Atomikos使用Oracle数据库mybatis
JMay是什么JMay是一款基于Spring、SpringMVC、Mybatis、Atomikos集成框架,用于快速搭建跨数据库、分布式事务(XA规范)支持的Java web项目.JMay有哪些功能1.基于spring,如沐春风的体验;2.扩展Mybatis-Generator,...
:测试spring初始注解:@Async,覆盖串行线程池自定义线程池,无返回值纯初始化,有返回值Future,有返回值CompletableFuture :整合redis,7大数据类型:string,list,set,zset,hash,geo,hyperloglog :...
配置灵活,简单方便.JTA:atomikos. 分布式事务,多数据源事务全靠他.Cache:spring-cache. 统一接口,注解使用,simple,redis... 自动切换.Scheduler:quartz. 开源稳定,支持集群.自家:hsweb-commons :通用工具类hsweb-...