最近在做一个数据统计的项目,这里涉及到多个数据库的数据统计,所以找到了一个不错的解决方案。
写一篇博客作为笔记。

例子介绍

类库:例子中使用的是MyBatis Plus和Dynamic Datasource的组合
开源项目地址:MyBatis Plus & Dynamic Datasource
Maven配置示例
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.0.6</version>
</dependency>
<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>2.4.2</version>
</dependency>

配置文件

这里的配置使用的是yml文件,主要的配置就是datasource,别的配置都是陪衬。
配置文件示例:
server:port: 2080
logging:level:cn.mrxionge.bootdemo: debugorg.springframework.web: debugorg.springframework.data: debug
mybatis-plus:executor-type: simple
spring:datasource:#配置hikari连接池hikari:minimum-idle: 4maximum-pool-size: 16connection-timeout: 10000idle-timeout: 30000connection-init-sql: set names utf8mb4#动态数据源配置dynamic:#主数据源primary: a01datasource:#数据源a01a01:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/a01?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456#数据源a02a02:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/a02?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456#数据源a03a03:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/a03?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456
这里需要注意一个问题,就是primary配置是必填项,这个作为全局的默认数据源。
每个数据源可以是不同机器上面的不同的数据库实例。例子中给的配置只是一个demo,所以是同一个MySQL实例的三个库而已,虽然简单,但是道理是一样的。
还有就是配置多数据源的时候,IDEA目前没有提示,自己多留意一下缩进就好了。
配置完成之后,我们可以通过启动程序看日志打印来查看是否配置成功。
日志示例:

中间红色方框的内容就是我们多数据源的加载信息。

添加测试数据

我们的示例比较简单,是三个不同的数据库中,三个同样结构的数据表,但是其中的数据不同。
数据库信息示例:

如图,我们在三个库中写入不同的数据,方便我们测试

动态数据源的简单实用

这里我们新建三个不用的Mapper文件,每个Mapper文件对应一个数据源,我们通过调用不同的Mapper文件中的方法来实现查询不同的数据库中的数据。
Mapper文件示例:
@DS(value = "a01")
@Mapper
public interface MapperA01 extends BaseMapper<UserInfo> {@Select("SELECT * FROM user_info")List<UserInfo> getAllUser();
}
@DS(value = "a02")
@Mapper
public interface MapperA02 extends BaseMapper<UserInfo> {@Select("SELECT * FROM user_info")List<UserInfo> getAllUser();
}
@DS(value = "a03")
@Mapper
public interface MapperA03 extends BaseMapper<UserInfo> {@Select("SELECT * FROM user_info")List<UserInfo> getAllUser();
}
这里我们创建了三个Mapper,每个Mapper文件上面都有一个“@DS”注解,这个注解就是指定这个Mapper接口里面的所有的方法都使用注解里面所配置的数据源。当然,DS注解的使用方法非常灵活,这里制作一个简单的例子,给出一个思路,方便理解和入门,详细的使用,请参考他们的官方文档。
注意:“@DS”注解请使用在方法上面,在类上面使用会出问题,上面的例子是之前的版本,新版本在Mapper上面使用会出现异常。

测试阶段

这里我们再写一个业务层和控制层,来测试我们的多数据源查询方法。
@Service
public class AppService {@Autowiredprivate MapperA01 mapperA01;@Autowiredprivate MapperA02 mapperA02;@Autowiredprivate MapperA03 mapperA03;/*** 查询A01库中的数据** @return 用户信息列表*/List<UserInfo> getUser01() {return mapperA01.getAllUser();}/*** 查询A02库中的数据** @return 用户信息列表*/List<UserInfo> getUser02() {return mapperA02.getAllUser();}/*** 查询A03库中的数据** @return 用户信息列表*/List<UserInfo> getUser03() {return mapperA03.getAllUser();}
}
@RestController
public class AppHandler {@Autowiredprivate AppService service;@GetMapping(path = "/get01")public Mono get01() {//查询A01数据return Mono.fromSupplier(service::getUser01);}@GetMapping(path = "/get02")public Mono get02() {//查询A02数据return Mono.fromSupplier(service::getUser02);}@GetMapping(path = "/get03")public Mono get03() {//查询A03数据return Mono.fromSupplier(service::getUser03);}
}
调用URL进行测试:

测试完成,是我们想要的结果。

结尾

以上的例子很简单,但并不意味着Dynamic Datasource的功能只有这些,详细的使用请大家去看这个项目的文档,结合自身的业务场景来选择一个最优的解决档案。当然,Dynamic Datasource应该是我使用中最简单最快捷最方便的多数据源解决方案
如果你使用的不是MyBatis Plus,而是MyBatis。嗯……答案是,没有任何问题!
[2020年2月18日补充]:这篇博客写了挺久了,我也没有做到保持更新,而且这个开源项目已经迭代了数个版本,增加了很多新的功能。如果这篇博客让你知道了有’dynamic-datasource’这个好东西,我觉得也足够了,因为学习的最好办法,就是去看第一手资料。那里有更多高阶且详细的使用法方,而我上面给出的例子只是最最初级操作。
官方GitHubWiki地址

SpringBoot多数据源解决方案相关推荐

  1. SpringBoot多数据源事务解决方案

    背景 之前有文章提供了springboot多数据源动态注册切换的整合方案,在后续使用过程中,发现在事务控制中有多种bug发生,决定对此问题进行分析与解决 前情提要 多数据源切换流程结构图如下所示,包含 ...

  2. SpringBoot 多数据源

    实现 1.建库建表 首先,我们在本地新建三个数据库名分别为master,slave1,slave2,我们的目前就是写入操作都是在master,查询是 slave1,slave2 因此我们在上一篇也就是 ...

  3. Springboot多数据源问题之 Could not resolve type alias ‘Blog‘.

    Springboot多数据源之 Could not resolve type alias 'Blog'. 由于配置了多数据源,mapper的xml文件放错了包.如下图 只需要把xml文件放到对应的包里 ...

  4. Springboot多数据源配置详解

    Springboot多数据源配置详解 概念 配置 多数据源使用 概念 一般来说,我们正常的业务只涉及一个数据源,在特定的业务场景中需要使用多个数据源的情况,就需要配置多个数据源来满足特定的业务需求.本 ...

  5. Springboot吞吐量优化解决方案

    原文地址:Springboot吞吐量优化解决方案_灬点点的博客-CSDN博客_springboot提高吞吐量 0.吞吐量是什么? 吞吐量:系统在单位时间内处理请du求的数量.只不过是一个很宽泛的术zh ...

  6. SpringBoot多数据源切换,AOP实现动态数据源切换

    SpringBoot多数据源切换,AOP实现动态数据源切换 操作数据一般都是在DAO层进行处理,可以选择直接使用JDBC进行编程 或者是使用多个DataSource 然后创建多个SessionFact ...

  7. springboot 多数据源配置的几种方式

    springboot多数据源配置的三种方式 application.yml配置 1.@Ds("配置数据源名称") 引入依赖 <dependency> <group ...

  8. SpringBoot多数据源及事务解决方案

    目录 1. 背景 2. 数据源切换原理 3. 配置文件解决方案 3.1 创建数据源 3.2 AOP处理 3.3 方案不足 4. 数据库表解决方案 4.1 设计数据源表 4.2 自定义数据源管理 4.2 ...

  9. SpringBoot排除数据源配置,配置决定行为

    项目场景: 最近接到一个需求,大概意思呢就是数据库连接不够用了,部分服务(分服务)就不需要配置数据源了,需要跟db打交道的地方全部改成rpc去调用具备db能力的服务(总服务) 问题描述: 其实需要改的 ...

最新文章

  1. IP地址审计在事件追溯中的应用
  2. mysql delete 优化_mysql delete之后的优化
  3. DataBinding的双向绑定实现原理
  4. 如何委婉的表达你的心思?
  5. 青岛智能物联网产才融合中心成立,山东大学携手百度飞桨海尔海纳云等共育AI人才
  6. 【招聘(深圳)】TCL通讯科技控股有限公司
  7. 秋式开源团队,欢迎您的加入!
  8. mobileconfigs.php,iOS APP .mobileconfig的生成
  9. 野生前端的数据结构练习(9)冒泡排序,选择排序,插入排序
  10. 怎么样做好手机网站的优化和推广呢?
  11. Android开发笔记(五十五)手机设备基本操作
  12. linux系统ip6tables怎么配置,ip6tables 基本配置
  13. 深度学习12-TFRecord详解
  14. scp传输文件的命令
  15. es6 将字符串转换为json_ES6中Json、String、Map、Object之间的转换
  16. 民企信息化建设个人经历(一)
  17. Java对象转换Map(工具类)
  18. python二进制转十进制编程_怎么用python二进制转换十进制
  19. 北航提出基于语言桥接的时空交互来进行准确指向性视频对象分割
  20. 【IoT毕业设计】树莓派开发板+机智云IoT+监测机器人

热门文章

  1. css实现元素水平垂直居中——6种方式
  2. 【CSS】水平垂直布局
  3. linux上必要软件,走向linux之必备软件
  4. 会计财务软件有哪些比较好的品牌?
  5. 视频一键识别生成字幕2
  6. python语言采用严格的什么填上恰当词语_Python语言是
  7. 魅族服务器升级维护中,网站升级维护中页面
  8. 《炬丰科技-半导体工艺》光学薄膜的湿刻蚀
  9. MATLAB与最小二乘法拟合数据
  10. Mysql之细思极恐(语法问题版)