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

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

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

标签:SpringBoot,Atomikos,多数据源
0
投稿

猜你喜欢

  • java开发RocketMQ生产者高可用示例详解

    2023-04-27 13:27:57
  • WebSocket实现Web聊天室功能

    2023-11-27 06:10:52
  • java版微信公众平台消息接口应用示例

    2022-10-04 10:22:58
  • 基于springboot搭建的web系统架构的方法步骤

    2023-11-21 13:33:51
  • Android Flutter实现搜索的三种方式详解

    2023-07-10 18:00:49
  • 使用Jackson反序列化遇到的问题及解决

    2023-11-13 21:12:14
  • JSON各种转换问题(json转List,json转对象等)

    2021-09-28 08:53:45
  • Mybatis实现SQL存储流程详解

    2022-09-11 05:17:05
  • Java事务管理学习之Spring和Hibernate详解

    2023-04-11 00:01:25
  • sin(x)如何求解的java代码实现方法

    2022-04-17 16:22:07
  • Spring MVC+FastJson+hibernate-validator整合的完整实例教程

    2021-10-31 13:20:13
  • 详解如何在SpringBoot中自定义参数解析器

    2023-07-24 16:06:51
  • Spring探秘之如何妙用BeanPostProcessor

    2021-07-01 22:41:46
  • 被kafka-client和springkafka版本坑到自闭及解决

    2023-08-23 15:07:36
  • 详解java中String、StringBuilder、StringBuffer的区别

    2023-06-17 06:03:23
  • mybatis-plus查询源码详解

    2023-02-02 11:58:02
  • 浅谈JVM垃圾回收之哪些对象可以被回收

    2021-08-14 18:57:47
  • springboot整合solr的方法详解

    2023-01-20 17:54:37
  • SpringBoot使用Spark过程详解

    2021-07-30 06:19:21
  • java开发MVC三层架构上再加一层Manager层原理详解

    2023-06-14 06:10:51
  • asp之家 软件编程 m.aspxhome.com