项目场景:
项目中用到多个数据库,用到了MybatisPlus的动态数据源。
问题描述:
因为数据量较多,所以采用多线程分批,插入数据,但是在插入的过程中报错,因为动态数据源的主数据源配的不是我想插入的数据库,虽然在Service设置注解@DS(“dataSource2”)但是不起作用。
原因分析:
可能是在多线程插入时默认主数据源为插入数据源
解决方案:
可以自己设置插入的数据源DynamicDataSourceContextHolder
class MyThread implements Runnable {
private CountDownLatch c;
private UserService userService;
private List<User> users;
public MyThread(List<User> users, CountDownLatch c, UserService userService) {
this.c = c;
this.users = users;
this.userService = userService;
}
@Override
public void run() {
//当前线程数据源为自定义
DynamicDataSourceContextHolder.push("dataSource2");
userService.saveBatch(users);
c.countDown();
//强制清空本地线程,防止内存泄露
DynamicDataSourceContextHolder.clear();
}
}