目录
问题描述
1、Atomikos事务管理器
2、MyBatis-Plus多数据源支持
dynamic-datasource
特性
约定
使用方法
mybatis-mate
特性
使用方法
问题描述
在多数据源的情况下,如果一个事务跨越多个数据源,当其中一个数据源的操作失败时,我们需要回滚所有已经执行的操作。然而,Java默认的事务管理机制只支持单个数据源的事务回滚,无法处理跨多个数据源的事务回滚。
1、Atomikos事务管理器
Atomikos是一个开源的事务管理器,它支持跨多个数据源的事务回滚。
下表展示了解决Java多数据源时事务回滚问题的步骤:
下面我们将逐步讲解每个步骤需要做的操作,并提供相应的代码和注释。
步骤1:配置Atomikos事务管理器
首先,我们需要在项目的依赖中添加Atomikos的相关依赖:
<dependency>
<groupId>com.atomikos</groupId>
<artifactId>transactions-jta</artifactId>
<version>4.0.6</version>
</dependency>
参考:https://blog.51cto.com/u_16213361/9268072
Spring Boot+Atomikos进行多数据源的分布式事务管理详解和实例-CSDN博客
2、MyBatis-Plus多数据源支持
单一数据源已无法满足复杂业务需求,多数据源(动态数据源)应运而生。本文将介绍两种 MyBatis-Plus 的多数据源扩展插件:开源生态的 dynamic-datasource
和 企业级生态的 mybatis-mate
。
dynamic-datasource
dynamic-datasource
是一个开源的 Spring Boot 多数据源启动器,提供了丰富的功能,包括数据源分组、敏感信息加密、独立初始化表结构等。
特性
- 数据源分组:适用于多种场景,如读写分离、一主多从等。
- 敏感信息加密:使用
ENC()
加密数据库配置信息。 - 独立初始化:支持每个数据库独立初始化表结构和数据库。
- 自定义注解:支持自定义注解,需继承
DS
。 - 简化集成:提供对 Druid、HikariCP 等连接池的快速集成。
- 组件集成:支持 Mybatis-Plus、Quartz 等组件的集成方案。
- 动态数据源:支持项目启动后动态增加或移除数据源。
- 分布式事务:提供基于 Seata 的分布式事务方案。
约定
- 本框架专注于数据源切换,不限制具体操作。
- 配置文件中以下划线
_
分割的数据源首部为组名。 - 切换数据源可以是组名或具体数据源名。
- 默认数据源名为
master
,可通过spring.datasource.dynamic.primary
修改。 - 方法上的注解优先于类上的注解。
使用方法
1、引入依赖:
- SpringBoot2
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${version}</version>
</dependency>
- SpringBoot3
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
<version>${version}</version>
</dependency>
2、配置数据源:
spring:
datasource:
dynamic:
primary: master
strict: false
datasource:
master:
url: jdbc:mysql://xx.xx.xx.xx:3306/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
slave_1:
url: jdbc:mysql://xx.xx.xx.xx:3307/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
slave_2:
url: ENC(xxxxx)
username: ENC(xxxxx)
password: ENC(xxxxx)
driver-class-name: com.mysql.jdbc.Driver
3、使用 @DS
切换数据源:
@Service
@DS("slave")
public class UserServiceImpl implements UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
@DS("slave_1")
public List selectByCondition() {
return jdbcTemplate.queryForList("select * from user where age >10");
}
}
更多使用教程请参考Dynamic-Datasource 官网
mybatis-mate
mybatis-mate
是一个 MyBatis-Plus 的付费企业组件,内置很多好用的高级特性,其中包括多数据源扩展组件,提供了高效简单的多数据源支持。
特性
- 注解
@Sharding
:支持通过注解切换数据源。 - 配置:支持灵活的数据源配置。
- 动态加载卸载:支持动态加载和卸载数据源。
- 多数据源事务:支持 JTA Atomikos 分布式事务。
使用方法
1、配置数据源:
mybatis-mate:
sharding:
primary: mysql
datasource:
mysql:
- key: node1
...
- key: node2
cluster: slave
...
postgres:
- key: node1
...
2、使用 @Sharding
切换数据源:
@Mapper
@Sharding("mysql")
public interface UserMapper extends BaseMapper<User> {
@Sharding("postgres")
Long selectByUsername(String username);
}
3、切换指定数据库节点:
// 切换到 mysql 从库 node2 节点
ShardingKey.change("mysqlnode2");
更多使用示例请参考
-
多数据源动态加载卸载:👉 mybatis-mate-sharding-dynamic
-
多数据源事务(jta atomikos):👉 mybatis-mate-sharding-jta-atomikos
通过上述介绍,我们可以看到 dynamic-datasource
和 mybatis-mate
都提供了强大的多数据源支持,开发者可以根据项目需求选择合适的插件来实现数据源的灵活管理。
如果框架使用的mybits-plus建议采用2