不灭的焱

革命尚未成功,同志仍须努力下载JDK17

作者:php-note.com  发布于:2022-05-14 16:05  分类:Java框架/系统  编辑

一、引言

在我们实际业务开发中,难以避免需要同时涉及多个数据库,可能一个API中所需要的数据,往往是包含了多个数据库中的数据,这个时候我们就需要在项目运行中,切换数据源。

为什么会有这篇文章呢,那是因为小编在使用mybatis-plus这个框架,明明一个多数据源配置很简单,但是网上其他博客着实太过于复杂了。

从数据源配置、每一个数据源配置一个config类、配置枚举类、还有需要自己实现AOP的,当时小编就在想mybatis-plus是为简化而生,怎么搞这么复杂。

接下来不要眨眼,很快就实现了。

二、具体实现

步骤一:我们先需要引入maven配置,这里小编是使用3.5.1版本,可自选。dynamic-datasource-spring-boot-starter 是一个基于springboot的快速集成多数据源的启动器。

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

步骤二:多数据源配置,需要注意的后面都有写注释。

spring:
  datasource:
    dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      strict: false #设置严格模式,默认false不启动。 启动后在未匹配到指定数据源时候会抛出异常,不启动则使用默认数据源。
      datasource:
        master:
          url: jdbc:mysql://xx.xx.xx.xx:3306/dynamic
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
        slave_1:
          url: jdbc:mysql://xx.xx.xx.xx:3307/dynamic
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver
        slave_2:
          url: ENC(xxxxx) # 内置加密,使用请查看详细文档
          username: ENC(xxxxx)
          password: ENC(xxxxx)
          driver-class-name: com.mysql.jdbc.Driver
          schema: db/schema.sql # 配置则生效,自动初始化表结构
          data: db/data.sql # 配置则生效,自动初始化数据
          continue-on-error: true # 默认true,初始化失败是否继续
          separator: ";" # sql默认分号分隔符

其他参考:

# 多主多从                      纯粹多库(记得设置primary)                   混合配置
spring:                               spring:                               spring:
  datasource:                           datasource:                           datasource:
    dynamic:                              dynamic:                              dynamic:
      datasource:                           datasource:                           datasource:
        master_1:                             mysql:                                master:
        master_2:                             oracle:                               slave_1:
        slave_1:                              sqlserver:                            slave_2:
        slave_2:                              postgresql:                           oracle_1:
        slave_3:                              h2:                                   oracle_2:

步骤三:步骤三就可以直接使用啦,真的是太方便了,@DS 可以注解在方法上或类上,同时存在就近原则 方法上注解 优先于 类上注解

注解 结果
没有@DS 默认数据源
@DS("dsName") dsName可以为组名也可以为具体某个库的名称
/**
 * 数据源切换测试
 */
@Service
@AllArgsConstructor
public class TestJdbcServiceImpl implements TestJdbcService {
 
    // 数据库1的mapper
    private final KkOrderMapper kkOrderMapper;
 
    // 数据库2的mapper
    private final SysUserMapper sysUserMapper;
 
    // 不写DS默认是主数据源
    @Override
    public void testMySql1() {
        List<KkOrder> kkOrders = kkOrderMapper.selectList(null);
        System.out.println(kkOrders.size());
    }
 
    // 注解里面填写多数据源配置的名字
    @DS("slave_1")
    @Override
    public void testMysql2() {
        List<SysUser> sysUsers = sysUserMapper.selectList(null);
        System.out.println(sysUsers.size());
    }
}

三、官方建议以及特性

约定

  1. 本框架只做 切换数据源 这件核心的事情,并不限制你的具体操作,切换了数据源可以做任何CRUD。
  2. 配置文件所有以下划线 _ 分割的数据源 首部 即为组的名称,相同组名称的数据源会放在一个组下。
  3. 切换数据源可以是组名,也可以是具体数据源名称。组名则切换时采用负载均衡算法切换。
  4. 默认的数据源名称为 master ,你可以通过 spring.datasource.dynamic.primary 修改。
  5. 方法上的注解优先于类上注解。
  6. DS支持继承抽象类上的DS,暂不支持继承接口上的DS。
  7. 强烈建议只在service的类和方法上添加注解,不建议在mapper上添加注解

特性

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

 

 

参考:

  1. https://jiannan.blog.csdn.net/article/details/114100901 
  2. https://baomidou.com/pages/a61e1b/#文档-documentation