Mybatis-Plus多数据源使用多线程时失效的问题

最近遇到了一个大boss亲自负责的项目,为了快速交付,避免007,因此用到了mybatis-plus多数据源来处理跨库的状况。正当发际线稳步靠近脚后跟的过程当中,遇到了一特别不起眼的功能:须要在每一个库里都查一点数据,而后在代码里作数据的汇总。数据库

这种比芝麻还小的功能,确实不值得写一篇文章来占用宝贵的互联网资源。可是,在按照我本身的想法实现这个功能时,出问题了。mybatis

想法特别简单:当须要查询n个数据库时,我建立n个线程,每一个线程去对应的库里拿到数据。ide

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;
            }
        });
    }

珍爱秀发,远离编码code