RuoYi切换数据源和事务

本文介绍了在RuoYi框架中如何实现数据源的切换以及处理嵌套事务的情况,包括不同事务传播行为对子事务的影响:子事务提交遵循外层事务的决定,外层事务提交则子事务成功,外层回滚导致所有操作回滚。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RuoYi切换数据源和事务

// 切换数据源

@DataSource(DataSourceType.SLAVE)

// 开启新事务

补充:

外层事务嵌套子事务,子事务的提交结果受外层事务的提交或回滚影响
1.子事务提交-外层事务提交-提交成功
2.子事务提交-外层事务回滚-全部回滚
3.任一子务回滚-全部回滚

@Transactional(propagation = Propagation.REQUIRES_NEW) 
### 配置 RuoYi 框架中的多数据源支持 在 RuoYi 框架中实现 MySQL TiDB 的多数据源配置,可以通过 Spring Boot 提供的数据源动态切换机制来完成。以下是具体的配置方法: #### 1. 添加依赖项 为了支持多个数据库连接池以及 ORM 工具的功能扩展,在 `pom.xml` 文件中引入必要的依赖项。 ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.1</version> </dependency> <!-- 数据库驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.tidb</groupId> <artifactId>tidb-jdbc-driver</artifactId> <version>0.17.0</version> </dependency> ``` 上述代码片段展示了如何通过 Maven 引入 MyBatis Plus 及对应的 MySQL TiDB JDBC 驱动程序[^2]。 --- #### 2. 配置文件设置 (`application.yml`) 定义两个独立的数据源配置参数,分别对应 MySQL TiDB。 ```yaml spring: datasource: dynamic: primary: mysql # 默认数据源名称 strict: false # 是否严格匹配数据源 datasource: mysql: url: jdbc:mysql://localhost:3306/mysql_db?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC username: root password: root_password driver-class-name: com.mysql.cj.jdbc.Driver tidb: url: jdbc:tibd://localhost:4000/tidb_db?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC username: tidb_user password: tidb_password driver-class-name: org.tidb.jdbc.ClientDriver ``` 此部分描述了如何利用 Spring Dynamic Datasource 动态加载不同类型的数据库实例,并指定默认使用的主数据源为 MySQL[^1]。 --- #### 3. 创建自定义数据源管理器 编写 Java 类用于注册并初始化各个数据源对象至容器内。 ```java import com.alibaba.druid.pool.DruidDataSource; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; @Configuration public class DataSourceConfig { @Bean(name = "mysqlDataSource") @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.mysql") public DruidDataSource mysqlDataSource() { return new DruidDataSource(); } @Bean(name = "tidbDataSource") @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.tidb") public DruidDataSource tidbDataSource() { return new DruidDataSource(); } } ``` 以上代码实现了基于属性注入的方式创建两套不同的连接池资源实例[^3]。 --- #### 4. 实现服务层逻辑调用 当需要访问特定数据库,可通过注解方式标注当前操作所属的数据源上下文环境。 ```java @Service @DS("mysql") // 切换到 MySQL 数据源 public class UserServiceImpl implements UserService { private final UserMapper userMapper; public UserServiceImpl(UserMapper userMapper) { this.userMapper = userMapper; } @Override public List<User> getAllUsers() { return userMapper.selectList(null); } } @Service @DS("tidb") // 切换到 TiDB 数据源 public class OrderServiceImpl implements OrderService { private final OrderMapper orderMapper; public OrderServiceImpl(OrderMapper orderMapper) { this.orderMapper = orderMapper; } @Override public List<Order> getOrdersByUserId(Long userId) { QueryWrapper<Order> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("user_id", userId); return orderMapper.selectList(queryWrapper); } } ``` 这里演示了如何借助 `@DS` 注解读写分离策略下的具体业务场景处理流程。 --- ### 注意事项 - 确保每种数据库引擎版本兼容性良好。 - 测试阶段需验证事务一致性问题是否存在隐患。 - 生产环境中建议优化性能指标如最大活跃线程数等参数设定值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自由的风~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值