背景:使用多数据源@DS("XXX")的情况下,serviceImpl的方法中使用了异步(多线程)的方式执行了代码导致@DS("XXX")失效
解决方案:
使用DynamicDataSourceContextHolder指定数据源,并在异步内部的代码块执行完后执行清除操作,具体如下:
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
@Override
public Future<Map<String, Object>> getTableOverview(CountDownLatch latch) {
return executor.submit(new Callable<Map<String, Object>>() {
@DS("slave")
@Override
public Map<String, Object> call() throws Exception {
// 设置以后线程数据源
DynamicDataSourceContextHolder.push("slave");
Map<String, Object> result;
try {
// 具体的业务代码
result = getTableData();
} finally {
latch.countDown();
// 强制清空本地线程,避免内存透露,手动调用push可调用此办法确保革除
DynamicDataSourceContextHolder.clear();
}
return result;
}
});
}
参考文章:关于java:MybatisPlus多数据源使用多线程时失效的问题_mybatis多线程写数据库-CSDN博客