最近遇到了一个大boss亲自负责的我的项目,为了疾速交付,防止007,所以用到了mybatis-plus多数据源来解决跨库的状况。正当发际线稳步凑近脚后跟的过程中,遇到了一特地不起眼的性能:须要在每个库里都查一点数据,而后在代码里做数据的汇总。

这种比芝麻还小的性能,的确不值得写一篇文章来占用贵重的互联网资源。然而,在依照我本人的想法实现这个性能时,出问题了。

想法特地简略:当须要查问n个数据库时,我创立n个线程,每个线程去对应的库里拿到数据。

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

珍视秀发,远离编码