收藏夹吃灰系列(十三):Springboot项目配置多数据源,实例演示 | 开箱即用,超级详细。

Posted bug菌√

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了收藏夹吃灰系列(十三):Springboot项目配置多数据源,实例演示 | 开箱即用,超级详细。相关的知识,希望对你有一定的参考价值。

        嗨,小伙伴们,我是bug菌,时隔三日,我又回来啦!

今天我们来讲点什么嘞?奥,有了,最近啊,bug菌在埋头开发的时候有用到个一个特别好使的玩意,开箱即用,上手即用,谁不用谁后悔,真的!不信 你接着往下看(你们:切切切~~标题已经说明了一切,还搞神秘... ...我:低调低调,就让bug菌装一下嘛)

        好了,我们开始这期的正文吧。

一、前言

        正常情况下,我们日常开发web系统也好app也罢都是使用一个数据库,但是呢,总会有存在某些场景提供多数据源的场景,比如有些第三方项目提供数据全量同步的时候,出于考虑不想造成主库io性能消耗导致数据库服务压力过载,便会起个从库做数据同步,这个时候问题就来了,Springboot 配置db都是默认都是读取datasourece配置,但我要在yaml中配置多个数据库连接,还要支持数据查询指定切换,这该怎么实现呢?

        很多小伙伴可能就会喊了,这不是很简单,只需要明白Springboot是如何加载数据库配置的就能明白如何配置多个,我之前也配置过,结合mybatis,通过配置类来获取数据源以及mapper相关的扫描配置或者说使用aop自定义注解的形式来实现

        不,我嫌这些方案太复杂了,今天我就要给你们安利它: dynamic-datasource-spring-boot-starter。一个基于springboot的快速集成多数据源的启动器,真的就是开箱即用,超级方便。

        接下来我就为大家一一讲解,虽然配置起来很简单,但是坑也比较多,bug菌都为大家给跳过啦,你们就直接拿去现用即可!赠人玫瑰,手有余香!

二、dynamic-datasource-spring-boot-starter

1、简介

dynamic-datasource-spring-boot-starter 是一个基于springboot的快速集成多数据源的启动器。其支持 Jdk 1.7+, SpringBoot 1.4.x 1.5.x 2.x.x

2、特性

  • 支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。
  • 支持数据库敏感配置信息 加密 ENC()。
  • 支持每个数据库独立初始化表结构schema和数据库database。
  • 支持无数据源启动,支持懒加载数据源(需要的时候再创建连接)。
  • 支持 自定义注解 ,需继承DS(3.2.0+)。
  • 提供并简化对Druid,HikariCp,BeeCp,Dbcp2的快速集成。
  • 提供对Mybatis-Plus,Quartz,ShardingJdbc,P6sy,Jndi等组件的集成方案。
  • 提供 自定义数据源来源 方案(如全从数据库加载)。
  • 提供项目启动后 动态增加移除数据源 方案。
  • 提供Mybatis环境下的 纯读写分离 方案。
  • 提供使用 spel动态参数 解析数据源方案。内置spel,session,header,支持自定义。
  • 支持 多层数据源嵌套切换 。(ServiceA >>> ServiceB >>> ServiceC)。
  • 提供 **基于seata的分布式事务方案。
  • 提供 本地多数据源事务方案。

3、使用方法

1、老规矩,先引依赖。

pom.xml 中加上dynamic-datasource-spring-boot-starter的依赖包;

<!--配置多数据源-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.5.0</version>
</dependency>

2、配置数据源

spring:
  datasource:
    dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        master:
          driver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
          url: jdbc:mysql://localhost:3306/springboot_db?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
          username: root
          password: 123456
        slave_1:
          driver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
          url: jdbc:mysql://localhost:3306/test_db2?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
          username: root
          password: 123456

拓展:同时也支持多主多从,多种不同库类型以及混合配置。

3、实战演示

我们先来指定配置环境:

 配置好配置环境后,先启动项目,查看多库是否都正常连接。如下控制台启动打印的日志,表示两库都正常连接。

注意:若是遇到该如下报错,请参考bug菌写的这篇如何解决dynamic-datasource Please check the setting of primary...问题

此处就略过不展开做过多介绍啦。

 接着,我们先创建两个实体,分别对应db1和db2的user表。

 接着接口实现层:

 这里我就为大家讲解一下了。

数据源切换,则直接使用 @DS 注解切换数据源即可。

注:@DS 可以注解在方法上或类上,同时存在就近原则,方法上注解优先于类上注解

注解结果
没有@DS默认数据源
@DS("dsName")dsName可以为组名也可以为具体某个库的名称

4、访问接口查看结果。

 先是访问接口1:localhost:8888/dbUser/query-users-for-db-one

如下请求结果,大家请看,成功拿到了db1库中的数据。

 再请求下接口2:localhost:8888/dbUser/query-users-for-db-two

如下请求结果,大家请看,成功拿到了db2库中的数据。

 再做个测试,我们把db1与db2中的数据同时返回,看看能否成功:

我们先写两接口,然后分别将数据用map返回:

 请求结果如下:

 然后给大家看下数据库数据,以免造成怀疑说是同一个库中的数据。

这是db1库数据:

这是db2库数据:

 

        好啦,以上就是同mysql数据源的配置流程及实例演示啦,如果还有啥不清楚的小伙伴,欢迎下方留言。接着就是针对后边两种配置方式,就自行尝试啦,看上去都是一样的。

        有需求的小伙伴,看完之后,使用起来是不是很简单,压根不需要用传统的mybatis配置多个连接器,mybatis-plus都帮我们封装好啦,开箱即用。

... ...

OK,以上就是这期所有的内容啦,如果有任何问题欢迎评论区批评指正,咱们下期见。



 往期热文推荐:


 OK,今天的文章先写到这。如果问题还请及时批评指正。

❤如果文章对您有所帮助,就请在文章末尾的左下角把大拇指点亮吧!(#^.^#);

❤如果喜欢bug菌分享的文章,就请给bug菌点个关注吧!(๑′ᴗ‵๑)づ╭❤~;

❤对文章有任何问题欢迎小伙伴们下方留言或者入群探讨【群号:708072830】;

❤鉴于个人经验有限,所有观点及技术研点,如有异议,请直接回复参与讨论(请勿发表攻击言论,谢谢);

❤版权声明:本文为博主原创文章,转载请附上原文出处链接和本文声明,版权所有,盗版必究!(*^▽^*).

以上是关于收藏夹吃灰系列(十三):Springboot项目配置多数据源,实例演示 | 开箱即用,超级详细。的主要内容,如果未能解决你的问题,请参考以下文章

收藏夹吃灰系列:Springboot配置Thymeleaf实现静态页面访问 | 超级详细,建议收藏!

收藏夹吃灰系列:Springboot配置Thymeleaf实现静态页面访问 | 超级详细,建议收藏!

哇撒!这几个SpringBoot前后端分离项目(附源码),star过千,快去收藏夹吃灰吧。。。

收藏夹吃灰系列:实现springboot使用JDK自带的keytool生成SSL证书并配置HTTPS | 超级详细,建议收藏!

七个开源的 SpringBoot 前后端分离项目,Star过千,快去收藏夹吃灰吧!

收藏夹吃灰系列:谁说Spring提供的@Scheduled定时不好用?师妹看了直呼叫好!