最近遇到了一个大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