Java中MybatisPlus使用多线程多数据源失效

Java中MybatisPlus多线程多数据源失效问题

Java中MybatisPlus使用多线程多数据源失效

一:背景

Mybatis-Plus使用异步任务后不能找到指定设置的@DS数据库,所有请求指向了主数据库

二:解决方法

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
public void saveInventoryFlow(Long orgKkd, String orgNameKkd, List<SaveAbInventoryFlowReq> requests) {
    if (ObjectUtil.isEmpty(requests)) {
        return;
    }
    CompletableFuture.runAsync(() -> {
        DynamicDataSourceContextHolder.push("qjs");
        List<TemInventoryFlow> list = requests.stream().map(request -> {
            TemInventoryFlow abInventoryFlow = new TemInventoryFlow();
            BeanUtils.copyProperties(request, abInventoryFlow);
            abInventoryFlow.setOrgId(orgKkd);
            return abInventoryFlow;
        }).collect(Collectors.toList());
       
### MyBatisPlus 动态多数据源事务配置及解决方案 在动态多数据源场景下,MyBatisPlus 的事务管理可能会遇到一些挑战。以下是针对该问题的详细分析以及可行的解决方案。 #### 一、核心问题剖析 当使用 MyBatisPlus 结合动态多数据源时,如果未正确配置事务管理机制,则可能出现 **全局事务失效** 或者 **部分数据未回滚** 的情况。这是因为 MyBatisPlus 默认仅支持单 Service 方法内的单一数据源操作[^2]。一旦涉及跨多个数据源的操作,就需要引入额外的支持工具来协调这些事务行为。 --- #### 二、解决方案概述 ##### 1. 使用 Seata 实现分布式事务管理 Seata 是一种流行的分布式事务框架,能够很好地解决多数据源环境下的事务一致性问题。其工作机制基于 TCC(Try-Confirm-Cancel)、AT 模式或者 XA 协议,具体实现如下: - 配置 `@GlobalTransactional` 注解到业务方法上,确保整个流程被纳入分布式事务控制范围。 - 在 Spring Cloud 应用中集成 Seata 客户端,并完成 TM(Transaction Manager)和 RM(Resource Manager)的相关设置[^1]。 示例代码: ```java @Service public class OrderService { @Autowired private OrderMapper orderMapper; @Autowired private StockService stockService; // 假设这是一个远程调用的服务 @GlobalTransactional(timeoutMills = 30000, name = "order-create") public void createOrder(Order order) { // 插入订单记录至主库 orderMapper.insert(order); // 调用库存扣减接口 stockService.deductStock(order.getProductId(), order.getCount()); } } ``` 上述代码片段展示了如何利用 Seata 来保障订单创建过程中本地数据库写入与远程服务调用的一致性。 --- ##### 2. 利用 AOP 手动管理事务边界 对于不希望依赖外部组件的情况,可以通过自定义切面逻辑手动维护不同数据源间的事务关系。例如,在每次切换目标 DataSource 后显式开启新的 Connection 并将其绑定当前线程上下文中。 需要注意的是这种方式复杂度较高且容易出错,因此推荐优先考虑成熟方案如 Seata 或 Atomikos[^4]。 --- ##### 3. 引入第三方中间件 - Atomikos Atomikos 提供了一种轻量级却功能强大的 JTA (Java Transaction API) 实现方式,适用于小型项目快速搭建起基础版分布式的事务能力。它可以直接嵌套进现有的 Spring Boot 工程里而无需太多改动现有架构设计[^3]。 主要步骤包括但不限于以下几个方面: - 添加 Maven/Gradle 依赖; - 修改 application.properties 文件指定必要的参数选项; - 自定义 Configuration Bean 将所有参与方注册成为受控资源实例; 简单例子展示如下所示: ```xml <dependency> <groupId>com.atomikos</groupId> <artifactId>jta-spec-api</artifactId> <version>5.x.y</version> </dependency> <!-- 更多省略 --> ``` 接着调整 Java Config 类内容如下形式呈现出来即可满足基本需求了: ```java @Configuration @EnableJtaTransactions public class AppConfig { @Bean(initMethod="init", destroyMethod="close") public UserTransactionManager userTransactionManager() throws SystemException{ return new com.atomikos.icatch.jta.UserTransactionManager(); } /* Other beans omitted */ } ``` 最后记得测试验证最终效果是否达到预期标准! --- ### 总结说明 综上所述,面对 MyBatisPlus 多数据源环境下存在的潜在风险点可以从以上三种途径择优选取适合自身实际状况的最佳实践路径加以应对处理。无论是借助开源社区力量还是自主研发创新技术手段都能有效提升整体系统的健壮性和稳定性水平。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Java小白笔记

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

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

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

打赏作者

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

抵扣说明:

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

余额充值