软件编程
位置:首页>> 软件编程>> java编程>> SpringBoot使用Atomikos技术整合多数据源的实现

SpringBoot使用Atomikos技术整合多数据源的实现

作者:架构师_迦叶  发布时间:2021-11-08 23:46:23 

标签:SpringBoot,Atomikos,多数据源

Atomikos是一个为Java平台提供增值服务的并且开源类事务管理器,如果将事务统一注册到Atomikos中,则可以统一管理。常用于后台管理系统的多数据库操作。

多数据源的划分方式

方式: a、按包名 b、按注解区分
Springboot默认集成事务,只主要在方法上加上@Transactional即可,不需要开启@EnableTransactionManagement注解
如果多个数据库,则每个方法都需要单独设置事务管理器@Transactional(transactionManager = "test2TransactionManager"),如果事务中含多数据源则无效。

Atomikos使用

1.依赖引入


<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>

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 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

3.配置代码


@Data
@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;
}

@Data
@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;
}

@Configuration
// basePackages 最好分开配置 如果放在同一个文件夹可能会报错
@MapperScan(basePackages = "com.itmayiedu.test01", sqlSessionTemplateRef = "testSqlSessionTemplate")
public class MyBatisConfig1 {

// 配置数据源
 @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);
 }
}

@Configuration
@MapperScan(basePackages = "com.itmayiedu.test02", sqlSessionTemplateRef = "test2SqlSessionTemplate")
public class MyBatisConfig2 {

// 配置数据源
 @Bean(name = "test2DataSource")
 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("test2DataSource");

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 = "test2SqlSessionFactory")
 public SqlSessionFactory testSqlSessionFactory(@Qualifier("test2DataSource") DataSource dataSource)
     throws Exception {
   SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
   bean.setDataSource(dataSource);
   return bean.getObject();
 }

@Bean(name = "test2SqlSessionTemplate")
 public SqlSessionTemplate testSqlSessionTemplate(
     @Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
   return new SqlSessionTemplate(sqlSessionFactory);
 }
}

4.启动加载配置

@EnableConfigurationProperties(value = { DBConfig1.class, DBConfig2.class })
使用还是正常使用@Transactional方式

来源:https://www.jianshu.com/p/00e0f625518d

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com