利用spring boot集成JTA(Atomikos案例)实现分布式事务控制;
maven引入:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>
原理简述:
将spring原有的数据源信息管理的类型改为atomikos实现的AtomikosDataSourceBean数据源类(他也是javax.sql.DataSource的实现类),该类有一个属性是xaDataSource(xa就是分布式事务处理的一种模型规范),实现一下xaDataSource赋给这个属性;
之后各个数据源不要再独自去声明事务控制对象了,因为这时候Atomikos会自动有一个统一的分布式事务控制对象来控制事务;
代码:
application.yml 数据源配置方式:
spring:
datasource01:
mapperPackage: com.alicyu.springcloud.dao.dbone #mapper包路径
mapperxmlDir: classpath:mybatis/mapper/dbone/**/*.xml #mapper.xml路径
entityPackage: com.alicyu.springcloud.entities.dbone #实体包路径
mybatiscfg: classpath:mybatis/mybatis.cfg.xml #mapper对应mybatis通用配置文件路径
url: jdbc:mysql://localhost:3306/clouddb01?useSSL=false
username: root
password: zhicheng
minPoolSize: 3
maxPoolSize: 25
maxLifetime: 20000
borrowConnectionTimeout: 30
loginTimeout: 30
maintenanceInterval: 60
maxIdleTime: 60
datasource02:
mapperPackage: com.alicyu.springcloud.dao.dbtwo #mapper包路径
mapperxmlDir: classpath:mybatis/mapper/dbtwo/**/*.xml #mapper.xml路径
entityPackage: com.alicyu.springcloud.entities.dbtwo #实体包路径
mybatiscfg: classpath:mybatis/mybatis.cfg.xml #mapper对应mybatis通用配置文件路径
url: jdbc:mysql://localhost:3306/clouddb02?useSSL=false
username: root
password: zhicheng
minPoolSize: 3
maxPoolSize: 25
maxLifetime: 20000
borrowConnectionTimeout: 30
loginTimeout: 30
maintenanceInterval: 60
maxIdleTime: 60
package com.alicyu.config;
import lombok.Data;
@Data
public class DBConfig1 {
private String entityPackage;
private String mapperxmlDir;
private String mybatiscfg;
private String url;
private String username;
private String password;
private int minPoolSize;
private int maxPoolSize;
private int maxLifetime;
private int borrowConnectionTimeout;
private int loginTimeout;
private int maintenanceInterval;
private int maxIdleTime;
private String testQuery;
}