Java中MybatisPlus使用多线程多数据源失效
Java中MybatisPlus使用多线程多数据源失效
文章目录
- Java中MybatisPlus使用多线程多数据源失效
- 一:背景
- 二:解决方法
- 三:其他导致@DS失效的条件
- 3.1、@Transactional
一:背景
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());temInventoryFlowRepo.saveBatch(list);DynamicDataSourceContextHolder.clear();}, poolExecutor);
}
三:其他导致@DS失效的条件
3.1、@Transactional
Spring的@Transactional声明式事务管理时通过动态代理实现的。
解决方法:
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)