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
本文详细介绍了如何在Spring Boot项目中使用Atomikos实现跨数据源的分布式事务管理,包括引用jta-atomikos依赖、配置多数据源、整合MyBatis以及在Service层使用注解实现事务控制。
520

被折叠的 条评论
为什么被折叠?



