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

码途映雪客
• 阅读 5786

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

珍爱秀发,远离编码

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
SSH实现动态数据源切换,事务场景下使用AOP
上周写代码遇到了切换数据源的问题,在同一个方法中向两个不同数据源做一些操作,但是这个方法使用了事务,所以网上一般动态切换数据源的方法就失效了。框架是spirngmvchibernate,数据库是oracle,连接池druid。一般情况下,操作数据都是在DAO层进行处理。一种办法是使用多个DataSource然后创建多个SessionFa
Stella981 Stella981
3年前
SpringBoot集成Mybatis动态多数据源后,MybatisPlus的IPage失效的问题解决方案
SpringBoot集成Mybatis动态多数据源后,MybatisPlus的IPage失效的问题解决方案参考文章:(1)SpringBoot集成Mybatis动态多数据源后,MybatisPlus的IPage失效的问题解决方案(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F
Easter79 Easter79
3年前
SpringBoot集成Mybatis动态多数据源后,MybatisPlus的IPage失效的问题解决方案
SpringBoot集成Mybatis动态多数据源后,MybatisPlus的IPage失效的问题解决方案参考文章:(1)SpringBoot集成Mybatis动态多数据源后,MybatisPlus的IPage失效的问题解决方案(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F
Stella981 Stella981
3年前
Android 数据存储笔记
我最近做项目用到了这个SQLite本地数据库,所以写篇博客总结一下,希望也能对小白有所帮助什么时候用SQLite(有固定规则的,大量的数据要保存时)SharedPreferences是一种轻型的数据存储方式,在保存数据的时候其实存储的是keyvalue对,类似于M
Wesley13 Wesley13
3年前
3分钟搞定SpringBoot+Mybatis+druid多数据源和分布式事务
    在一些复杂的应用开发中,一个应用可能会涉及到连接多个数据源,所谓多数据源这里就定义为至少连接两个及以上的数据库了。    下面列举两种常用的场景:    一种是读写分离的数据源,例如一个读库和一个写库,读库负责各种查询操作,写库负责各种添加、修改、删除。    另一种是多个数据源之间并没有特别明显的操作,只是程序
Stella981 Stella981
3年前
JPA项目多数据源模式整合Sharding
引言前一篇博文,已经完整的介绍了数据库脱敏的场景及方案,来自京东数科的ShardingJDBC开源项目通过对数据源中间代理的方式透明化的实现了这个功能,但是,功能虽然实现了,sql兼容的小问题还是很多,比如目前不支持子查询,数据库定义的关键字不允许使用,等等问题,反观我们需要加解密的字段,其实相比业务的sql来说占比非常小,即使遇
Wesley13 Wesley13
3年前
.net 获取邮箱邮件列表和内容
  需求:  最近项目里遇到了个问题,对方没有提供直接获取数据源的api接口,而是通过邮件发数据的。这就需要接收邮件后解析邮件内容获得数据。  分析:  想在代码里实时获取邮件,可以通过邮件的几个协议来实现,常用的几个协议有POP3协议,SMTP协议,IAMP协议。  1.pop3:(PostOfficeProtocal3),3是版本
Stella981 Stella981
3年前
SQL Server Profiler使用教程,通俗易懂才是王道(转载)
  做开发,平时难免和数据库打交道,特别是写存储过程,对于我们这些不常写SQL的人来说是一件极其痛苦的事,每次写完运行总是有错,如果用的是本地数据库的话还好,可以在本机调试SQL,那如果在数据库在服务器上面,调试被禁用,那就悲剧了~  最近,由于工作需求,写一个存储过程,有几十个参数,数据库在服务器上面,写完了,测试完查询语句没有问题,但是到了项目里面查
Easter79 Easter79
3年前
SQL Server Profiler使用教程,通俗易懂才是王道(转载)
  做开发,平时难免和数据库打交道,特别是写存储过程,对于我们这些不常写SQL的人来说是一件极其痛苦的事,每次写完运行总是有错,如果用的是本地数据库的话还好,可以在本机调试SQL,那如果在数据库在服务器上面,调试被禁用,那就悲剧了~  最近,由于工作需求,写一个存储过程,有几十个参数,数据库在服务器上面,写完了,测试完查询语句没有问题,但是到了项目里面查
多数据源管理:掌握@DS注解的威力 | 京东云技术团队
大家在日常后端开发过程,不可避免的会接触到需要用到配置多个数据源的场景,在这里,小编介绍一种简单方便的,只需要简单的配置和一个@DS注解就能实现动态数据源的方式,这种动态数据源底层原理是基于Mybatisplus来实现的。1、配置方式首先是pom.xmlc
京东云开发者 京东云开发者
10个月前
实际上手体验maven面对冲突Jar包的加载规则
一、问题背景相信大家在日常的开发过程中都遇到过Jar包冲突的问题,emm,在最近处理业务需求时我也遇到了不同版本jar包冲突导致项目加载出错的问题。主要是一个完整的项目会不可避免的使用第三方的Jar包来实现功能开发,各种第三方包之间可能会存在依赖关系,不同