MybatisPlus多数据源配置

举报
多米诺的古牌 发表于 2022/01/20 17:12:10 2022/01/20
【摘要】 1.简介多数据源即需要在不同库上进行操作时所需要的配置,分为不同服务跨库进行操作、相同服务跨库进行操作,本例中按照mybatisPlus的方法进行操作处理。这种也可以称为动态数据源,主要操作是在方法上、类上或者mapper上进行@DS(“配置好的数据源的名称”)注解的标注,动态切换数据源,没有标注的会使用默认配置的数据源,标注的名字的则会使用已存在的配置的这个名字的数据源,简单便捷~2.my...

1.简介

多数据源即需要在不同库上进行操作时所需要的配置,分为不同服务跨库进行操作、相同服务跨库进行操作,本例中按照mybatisPlus的方法进行操作处理。

这种也可以称为动态数据源,主要操作是在方法上、类上或者mapper上进行@DS(“配置好的数据源的名称”)注解的标注,动态切换数据源,没有标注的会使用默认配置的数据源,标注的名字的则会使用已存在的配置的这个名字的数据源,简单便捷~

2.mybatisPlus多数据源操作

官网文档

2.1 首先是导入多数据源的依赖

注意一点是次数导入的依赖的版本号需要与项目其他相关的使用mybatisPlus的版本号保持一致,要不一致可能会导致循环依赖(不同版本直接,不知道用哪一个)的情况。

<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
  <version>${version}</version>
</dependency>

2.2 配置application.yml中的多数据源

此处以mysql为例,其中dynamic下的primary为默认的数据源,在后面使用中,如果没有使用@DS进行标注使用其他的数据源,会默认使用此处的数据源。

在spring.datasource.dynamic.datasource下是配置的多数据源,名称可以任意起,可以配置很多个。

#配置数据源
spring: 
  datasource:
    type: com.zaxxer.hikari.HikariDataSource   # 数据源类型:HikariCP
    dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      datasource:
        master:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/test1?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
          username: root
          password: password
        slave:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/test2?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
          username: root
          password: password

2.3 使用

只需要在方法或者类名上加@DS(“上面配置的多数据源签名的名字”),即可开启多数据源的查询操作。

其中多数据源在不切换数据源的sql查询是这样的 select * from 数据库1.t1 LEFT JOIN 数据库2.t2 ON 数据库1.t1.id = 数据库2.t2.id,只需要在我们正常的sql中的字段前面加上数据库名就可以了,这里是适用于同服务不同库直接的操作。

@DS("slave")
public XXX test(XXX xxx...) {
}

使用时需要注意以下几点:

2.3.1 不能使用事务,否则数据源不会切换,使用的还是第一次加载的数据源;

2.3.2 第一次加载数据源之后,第二次、第三次…操作其它数据源,如果数据源不存在,使用的还是第一次加载的数据源;

2.3.3 数据源名称不要包含下划线,否则不能切换。

2.4 一次使用多个数据源进行操作

一次使用多个数据源进行操作,是通过多线程的方法开启多个个连接进行操作的。参考

由于没有相关业务暂时没有测试过下面这种方法,在此记录一下待后面有空了进行测试总结~

   @Override
    @DataSource(value = DataSourceNames.TWO)
    public Map<String, Object> getSandardByReportId(Integer id) {

        ExecutorService executor = Executors.newSingleThreadExecutor();
        FutureTask<Integer> task = new FutureTask<Integer>(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                return getStandardIdBy(id);
            }
        });
        executor.submit(task);

        Map<String, Object> map = null;
        try {
            map = getSandardMapById(task.get());
            return map;
        } catch (InterruptedException e) {
            e.printStackTrace();
            return null;
        } catch (ExecutionException e) {
            e.printStackTrace();
            return null;
        }
    }

    @DataSource(value = DataSourceNames.TWO)
    public Map<String, Object> getSandardMapById(Integer id) {
        Map<String, Object> map = craftExtrCheckStandardMapper.getStandardById(id);
        return map;
    }

    @DataSource(value = DataSourceNames.ONE)
    public Integer getStandardIdBy(Integer reportId) {
        Integer checkIdByReportId = extrProductOrderMapper.getCheckIdByReportId(reportId);
        return checkIdByReportId;
    }

参考一 @DS轻松解决动态数据源问题

参考二 事务和@DS同时使用的操作

因为所需要处理的业务在同一个服务器上的跨库操作,所以暂时没有测过不同服务直接的跨库操作,还有上面这种@DS和事务一起使用的情况暂时没有测过。

参考三 若依框架配置多数据源

参考四 若以框架配置数据源官网

以上就是今天爬坑内容,爬完一个坑还有另一个坑,希望后面能顺顺利利的~加油~


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。