1.引用jta-atomikos架包
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-jta-atomikos</artifactId>
-
</dependency>
2,首先配置数据源,因为是要演示分布式事务管理所以要配置多个数据源(2个)
-
# Mysql 1
-
mysql.datasource.test1.url = jdbc:mysql://localhost:3306/test01?useUnicode=true&characterEncoding=utf-8
-
mysql.datasource.test1.username = root
-
mysql.datasource.test1.password = root
-
mysql.datasource.test1.minPoolSize = 3
-
mysql.datasource.test1.maxPoolSize = 25
-
mysql.datasource.test1.maxLifetime = 20000
-
mysql.datasource.test1.borrowConnectionTimeout = 30
-
mysql.datasource.test1.loginTimeout = 30
-
mysql.datasource.test1.maintenanceInterval = 60
-
mysql.datasource.test1.maxIdleTime = 60
-
mysql.datasource.test1.testQuery = select 1
-
# Mysql 2
-
mysql.datasource.test2.url =jdbc:mysql://localhost:3306/test02?useUnicode=true&characterEncoding=utf-8
-
mysql.datasource.test2.username =root
-
mysql.datasource.test2.password =root
-
mysql.datasource.test2.minPoolSize = 3
-
mysql.datasource.test2.maxPoolSize = 25
-
mysql.datasource.test2.maxLifetime = 20000
-
mysql.datasource.test2.borrowConnectionTimeout = 30
-
mysql.datasource.test2.loginTimeout = 30
-
mysql.datasource.test2.maintenanceInterval = 60
-
mysql.datasource.test2.maxIdleTime = 60
-
mysql.datasource.test2.testQuery = select 1
3,配置读取数据库属性文件
DBConfig1.java
-
package com.itmayiedu.config;
-
import org.springframework.boot.context.properties.ConfigurationProperties;
-
@ConfigurationProperties(prefix = "mysql.datasource.test1")
-
public class DBConfig1 {
-
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;
-
public String getUrl() {
-
return url;
-
}
-
public void setUrl(String url) {
-
this.url = url;
-
}
-
public String getUsername() {
-
return username;
-
}
-
public void setUsername(String username) {
-
this.username = username;
-
}
-
public String getPassword() {
-
return password;
-
}
-
public void setPassword(String password) {
-
this.password = password;
-
}
-
public int getMinPoolSize() {
-
return minPoolSize;
-
}
-
public void setMinPoolSize(int minPoolSize) {
-
this.minPoolSize = minPoolSize;
-
}
-
public int getMaxPoolSize() {
-
return maxPoolSize;
-
}
-
public void setMaxPoolSize(int maxPoolSize) {
-
this.maxPoolSize = maxPoolSize;
-
}
-
public int getMaxLifetime() {
-
return maxLifetime;
-
}
-
public void setMaxLifetime(int maxLifetime) {
-
this.maxLifetime = maxLifetime;
-
}
-
public int getBorrowConnectionTimeout() {
-
return borrowConnectionTimeout;
-
}
-
public void setBorrowConnectionTimeout(int borrowConnectionTimeout) {
-
this.borrowConnectionTimeout = borrowConnectionTimeout;
-
}
-
public int getLoginTimeout() {
-
return loginTimeout;
-
}
-
public void setLoginTimeout(int loginTimeout) {
-
this.loginTimeout = loginTimeout;
-
}
-
public int getMaintenanceInterval() {
-
return maintenanceInterval;
-
}
-
public void setMaintenanceInterval(int maintenanceInterval) {
-
this.maintenanceInterval = maintenanceInterval;
-
}
-
public int getMaxIdleTime() {
-
return maxIdleTime;
-
}
-
public void setMaxIdleTime(int maxIdleTime) {
-
this.maxIdleTime = maxIdleTime;
-
}
-
public String getTestQuery() {
-
return testQuery;
-
}
-
public void setTestQuery(String testQuery) {
-
this.testQuery = testQuery;
-
}
-
}
DBConfig2.java
-
package com.itmayiedu.config;
-
import org.springframework.boot.context.properties.ConfigurationProperties;
-
@ConfigurationProperties(prefix = "mysql.datasource.test2")
-
public class DBConfig2 {
-
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;
-
public String getUrl() {
-
return url;
-
}
-
public void setUrl(String url) {
-
this.url = url;
-
}
-
public String getUsername() {
-
return username;
-
}
-
public void setUsername(String username) {
-
this.username = username;
-
}
-
public String getPassword() {
-
return password;
-
}
-
public void setPassword(String password) {
-
this.password = password;
-
}
-
public int getMinPoolSize() {
-
return minPoolSize;
-
}
-
public void setMinPoolSize(int minPoolSize) {
-
this.minPoolSize = minPoolSize;
-
}
-
public int getMaxPoolSize() {
-
return maxPoolSize;
-
}
-
public void setMaxPoolSize(int maxPoolSize) {
-
this.maxPoolSize = maxPoolSize;
-
}
-
public int getMaxLifetime() {
-
return maxLifetime;
-
}
-
public void setMaxLifetime(int maxLifetime) {
-
this.maxLifetime = maxLifetime;
-
}
-
public int getBorrowConnectionTimeout() {
-
return borrowConnectionTimeout;
-
}
-
public void setBorrowConnectionTimeout(int borrowConnectionTimeout) {
-
this.borrowConnectionTimeout = borrowConnectionTimeout;
-
}
-
public int getLoginTimeout() {
-
return loginTimeout;
-
}
-
public void setLoginTimeout(int loginTimeout) {
-
this.loginTimeout = loginTimeout;
-
}
-
public int getMaintenanceInterval() {
-
return maintenanceInterval;
-
}
-
public void setMaintenanceInterval(int maintenanceInterval) {
-
this.maintenanceInterval = maintenanceInterval;
-
}
-
public int getMaxIdleTime() {
-
return maxIdleTime;
-
}
-
public void setMaxIdleTime(int maxIdleTime) {
-
this.maxIdleTime = maxIdleTime;
-
}
-
public String getTestQuery() {
-
return testQuery;
-
}
-
public void setTestQuery(String testQuery) {
-
this.testQuery = testQuery;
-
}
-
}
4,配置TestMyBatisConfig1,TestMyBatisConfig2,将两个数据源放入atomikos进行一个管理
TestMyBatisConfig1
-
package com.itmayiedu.datasource;
-
import java.sql.SQLException;
-
import javax.sql.DataSource;
-
import org.apache.ibatis.session.SqlSessionFactory;
-
import org.mybatis.spring.SqlSessionFactoryBean;
-
import org.mybatis.spring.SqlSessionTemplate;
-
import org.mybatis.spring.annotation.MapperScan;
-
import org.springframework.beans.factory.annotation.Qualifier;
-
import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean;
-
import org.springframework.context.annotation.Bean;
-
import org.springframework.context.annotation.Configuration;
-
import org.springframework.context.annotation.Primary;
-
import com.itmayiedu.config.DBConfig1;
-
import com.mysql.jdbc.jdbc2.optional.MysqlXADataSource;
-
@Configuration
-
@MapperScan(basePackages = "com.itmayiedu.test01", sqlSessionTemplateRef = "testSqlSessionTemplate")
-
public class TestMyBatisConfig1 {
-
// 配置数据源
-
@Primary
-
@Bean(name = "testDataSource")
-
public DataSource testDataSource(DBConfig1 testConfig) throws SQLException {
-
MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();
-
mysqlXaDataSource.setUrl(testConfig.getUrl());
-
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
-
mysqlXaDataSource.setPassword(testConfig.getPassword());
-
mysqlXaDataSource.setUser(testConfig.getUsername());
-
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
-
AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
-
xaDataSource.setXaDataSource(mysqlXaDataSource);
-
xaDataSource.setUniqueResourceName("testDataSource");
-
xaDataSource.setMinPoolSize(testConfig.getMinPoolSize());
-
xaDataSource.setMaxPoolSize(testConfig.getMaxPoolSize());
-
xaDataSource.setMaxLifetime(testConfig.getMaxLifetime());
-
xaDataSource.setBorrowConnectionTimeout(testConfig.getBorrowConnectionTimeout());
-
xaDataSource.setLoginTimeout(testConfig.getLoginTimeout());
-
xaDataSource.setMaintenanceInterval(testConfig.getMaintenanceInterval());
-
xaDataSource.setMaxIdleTime(testConfig.getMaxIdleTime());
-
xaDataSource.setTestQuery(testConfig.getTestQuery());
-
return xaDataSource;
-
}
-
@Primary
-
@Bean(name = "testSqlSessionFactory")
-
public SqlSessionFactory testSqlSessionFactory(@Qualifier("testDataSource") DataSource dataSource)
-
throws Exception {
-
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
-
bean.setDataSource(dataSource);
-
return bean.getObject();
-
}
-
@Primary
-
@Bean(name = "testSqlSessionTemplate")
-
public SqlSessionTemplate testSqlSessionTemplate(
-
@Qualifier("testSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
-
return new SqlSessionTemplate(sqlSessionFactory);
-
}
-
}
TestMyBatisConfig2
-
package com.itmayiedu.datasource;
-
import java.sql.SQLException;
-
import javax.sql.DataSource;
-
import org.apache.ibatis.session.SqlSessionFactory;
-
import org.mybatis.spring.SqlSessionFactoryBean;
-
import org.mybatis.spring.SqlSessionTemplate;
-
import org.mybatis.spring.annotation.MapperScan;
-
import org.springframework.beans.factory.annotation.Qualifier;
-
import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean;
-
import org.springframework.context.annotation.Bean;
-
import org.springframework.context.annotation.Configuration;
-
import com.itmayiedu.config.DBConfig1;
-
import com.itmayiedu.config.DBConfig2;
-
import com.mysql.jdbc.jdbc2.optional.MysqlXADataSource;
-
@Configuration
-
//basePackages 最好分开配置 如果放在同一个文件夹可能会报错
-
@MapperScan(basePackages = "com.itmayiedu.test02", sqlSessionTemplateRef = "testSqlSessionTemplate2")
-
public class TestMyBatisConfig2 {
-
// 配置数据源
-
@Bean(name = "testDataSource2")
-
public DataSource testDataSource(DBConfig2 testConfig) throws SQLException {
-
MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();
-
mysqlXaDataSource.setUrl(testConfig.getUrl());
-
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
-
mysqlXaDataSource.setPassword(testConfig.getPassword());
-
mysqlXaDataSource.setUser(testConfig.getUsername());
-
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
-
AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
-
xaDataSource.setXaDataSource(mysqlXaDataSource);
-
xaDataSource.setUniqueResourceName("testDataSource2");
-
xaDataSource.setMinPoolSize(testConfig.getMinPoolSize());
-
xaDataSource.setMaxPoolSize(testConfig.getMaxPoolSize());
-
xaDataSource.setMaxLifetime(testConfig.getMaxLifetime());
-
xaDataSource.setBorrowConnectionTimeout(testConfig.getBorrowConnectionTimeout());
-
xaDataSource.setLoginTimeout(testConfig.getLoginTimeout());
-
xaDataSource.setMaintenanceInterval(testConfig.getMaintenanceInterval());
-
xaDataSource.setMaxIdleTime(testConfig.getMaxIdleTime());
-
xaDataSource.setTestQuery(testConfig.getTestQuery());
-
return xaDataSource;
-
}
-
@Bean(name = "testSqlSessionFactory2")
-
public SqlSessionFactory testSqlSessionFactory(@Qualifier("testDataSource2") DataSource dataSource)
-
throws Exception {
-
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
-
bean.setDataSource(dataSource);
-
return bean.getObject();
-
}
-
@Bean(name = "testSqlSessionTemplate2")
-
public SqlSessionTemplate testSqlSessionTemplate(
-
@Qualifier("testSqlSessionFactory2") SqlSessionFactory sqlSessionFactory) throws Exception {
-
return new SqlSessionTemplate(sqlSessionFactory);
-
}
-
}
外加附上service层代码
-
package com.itmayiedu.test01.service;
-
import org.springframework.beans.factory.annotation.Autowired;
-
import org.springframework.stereotype.Service;
-
import org.springframework.transaction.annotation.Transactional;
-
import com.itmayiedu.entity.UserEntity;
-
import com.itmayiedu.test01.mapping.UserMapper1;
-
import com.itmayiedu.test02.mapping.UserMapper2;
-
@Service
-
public class UserService1 {
-
@Autowired
-
private UserMapper1 userMapper1;
-
@Autowired
-
private UserMapper2 userMapper2;
-
@Transactional
-
public int addUser1 (UserEntity userEntity){
-
userMapper2.addUser(userEntity.getName(), userEntity.getAge());
-
userMapper1.addUser(userEntity.getName(), userEntity.getAge());
-
return 1;
-
}
-
}
--------------------- 本文来自 WI_232995 的优快云 博客 ,全文地址请点击:https://blog.youkuaiyun.com/WI_232995/article/details/78124885?utm_source=copy