SpringBoot - MyBatis-Plus - 使用dynamic-datasource-spring-boot-starter支持多数据源(五)

写在前面

dynamic-datasource-spring-boot-starter 是一个基于 springboot 的快速集成多数据源的启动器,该插件可以不依赖 MyBatis-Plus独立使用。适用于多种场景:纯粹多库、读写分离、一主多从、混合模式,支持数据源的分组。
中文文档

特性

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

约定

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

①. 添加依赖

<dependency>
    <groupId>com.baomidougroupId>
    <artifactId>dynamic-datasource-spring-boot-starterartifactId>
    <version>3.5.0version>
dependency>

另: 还需要添加其他的数据库的驱动依赖

②. 修改配置

# 以下是一主多从的场景:
spring: 
  datasource:
    druid:
      stat-view-servlet:
        enabled: true
        loginUsername: admin
        loginPassword: 123456
    dynamic:
      # 默认值为: master。用于设置默认的数据源或者数据源组
      primary: master
      # 是否启用严格模式, 默认值为false, 表示不启动。 如果启动后当未匹配到指定数据源时回抛出异常, 如果不启动当未匹配到指定数据源时会使用默认数据源.比如: 当代码中切换数据源为@DS("h2"), 因为没有配置名称为h2的数据源, 所以会使用默认的数据源master。 
      strict: false
      druid:
        initial-size: 5
        min-idle: 5
        maxActive: 20
        maxWait: 60000
        timeBetweenEvictionRunsMillis: 60000
        minEvictableIdleTimeMillis: 300000
        validationQuery: SELECT 1 FROM DUAL
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        poolPreparedStatements: true
        maxPoolPreparedStatementPerConnectionSize: 20
        filters: stat,wall,slf4j
        connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
      datasource:
        # 主库数据源
        master:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/servicex-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
          username: root
          password: 123456
        # 从库数据源
        slave_1:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/servicex-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
          username: root
          password: 123456
        slave_2:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/servicex-cloud2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
          username: root
          password: 123456          
# 以下是多主多从的场景:
spring: 
  datasource:
    dynamic:
      datasource:
        # 主库数据源
        master_1:
        master_2:
        # 从库数据源
        slave_1:
        slave_2:
        slave_3:
# 以下是多库的场景:
spring: 
  datasource:
    dynamic:
      primary: mysql
      datasource:
        # 主库数据源
        mysql:
        oracle:
        mongodb:
        postgresql:

③. 添加注解

public interface NoticeMapper {
    @DS("master")
    public Notice selectNoticeById(Long noticeId);
    @DS("slave")
    public List<Notice> selectNoticeList(Notice notice);
}

A. @DS("xxx")可以注解在方法上和类上,如果同时存在,方法注解优先于类上注解。
   强烈建议注解在 service 实现类或 mapper 接口方法上;
B. @DS("xxx") 指定使用 xxx 这个数据源,xxx 可以为组名也可以为具体某个数据源的名称。
   如果是组名,则切换时采用轮询负载均衡算法切换。
   如果指定的组名或者数据源不存在,且当strict=false时,则自动使用默认数据源(主库);
C. 如果方法上和类上未指定@DS("xxx"),则使用默认数据源(主库);
D. 如果@DS("xxx") 指定的是一个分组,且该分组下有多个数据库,那么会自动进行负载均衡。
E. 配置文件中所有以下划线 _ 分割的数据源,按照下划线 _ 分割分隔后的,前半部分即为组的名称,
   相同组名称的数据源会放在一个组下。
   如上所示在一主多从的场景中,slave_1和slave_2的组为slave,当配置@DS("slave")时,
   slave_1和slave_2这两个数据源便会自动进行轮询负载均衡。

你可能感兴趣的:(SpringBoot,spring,boot)