关于java:MybatisPlus多数据源使用多线程时失效的问题
Mybatis-Plus
多数据源应用也是极为不便,应用@DS
注解即可。然而不论加在类上还是加在实现接口的办法上,均不能正确的找到对应的数据库,所有的线程都抓着主数据库不放。
几经周折,屡次试验,最终将多数据源的注解申明在了Callable
实现类的call
办法上,并且须要用编码的形式,设置以后线程数据源名称,并在以后线程执行完结后,再将其革除掉。
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;
}
});
}