MybatisPlus多数据源配置

网友投稿 2361 2022-05-30

1.简介

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

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

2.mybatisPlus多数据源操作

官网文档

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

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

com.baomidou dynamic-datasource-spring-boot-starter ${version}

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 一次使用多个数据源进行操作

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

MybatisPlus多数据源配置

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

@Override @DataSource(value = DataSourceNames.TWO) public Map getSandardByReportId(Integer id) { ExecutorService executor = Executors.newSingleThreadExecutor(); FutureTask task = new FutureTask(new Callable() { @Override public Integer call() throws Exception { return getStandardIdBy(id); } }); executor.submit(task); Map 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 getSandardMapById(Integer id) { Map 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和事务一起使用的情况暂时没有测过。

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

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

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

SQL 数据库

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:一日一技:如何正确管理项目的环境变量
下一篇:蓝牙核心规范(V5.2)4.0-深入详解之错误码
相关文章