Skip to content

切换为多数据源

最后更新: 13 天前
实践版本: v4.0.0

ContiNew Admin 在 v3.4.0 版本(对应 ContiNew Starter v2.7.1)中移除了默认集成的多数据源组件,旨在降低新项目的上手成本和简化配置复杂度。

若你的业务场景需要使用多数据源功能,可以通过以下两种方式实现:

  1. 参考提交记录逆向还原多数据源相关代码
  2. 按照本文档所述步骤重新引入多数据源功能

本文将介绍如何基于 MyBatis Plus ORM 框架重新集成多数据源功能。

步骤 1:引入依赖

首先,在 continew-common/pom.xml 引入多数据源依赖。(不需要声明版本,在 ContiNew Starter 中已经锁定过了)

continew-common/pom.xml
xml
<!-- Dynamic Datasource(基于 Spring Boot 的快速集成多数据源的启动器) -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
</dependency>

步骤 2:配置多数据源

修改 application-dev.yml 文件中的数据源配置,添加动态数据源相关配置。生产环境部署前,需对应修改 application-prod.yml 等环境配置文件。

continew-server/application-dev.yml
yaml
--- ### 数据源配置
spring.datasource:
  type: com.zaxxer.hikari.HikariDataSource
  ## 动态数据源配置(可配多主多从:m1、s1...;纯粹多库:mysql、oracle...;混合配置:m1、s1、oracle...)
  dynamic:
    # 是否启用 P6Spy(SQL 性能分析组件,该插件有性能损耗,不建议生产环境使用)
    p6spy: true
    # 设置默认的数据源或者数据源组(默认:master)
    primary: master
    # 严格匹配数据源(true:未匹配到指定数据源时抛异常;false:使用默认数据源;默认 false)
    strict: false
    datasource:
      # 主库配置(可配多个,构成多主)
      master:
        url: jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:continew_admin}?serverTimezone=Asia/Shanghai&useSSL=true&useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&autoReconnect=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
        username: ${DB_USER:root}
        password: ${DB_PWD:123456}
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: ${spring.datasource.type}
      # 从库配置(可配多个,构成多从)
      slave_1:
        url: jdbc:postgresql://${DB_HOST_SLAVE:127.0.0.1}:${DB_PORT_SLAVE:5432}/${DB_NAME_SLAVE:continew_admin}?options=-c%20TimeZone=Asia/Shanghai&sslmode=prefer&channelBinding=require&stringtype=unspecified
        username: ${DB_USER_SLAVE:postgres}
        password: ${DB_PWD_SLAVE:123456}
        # 延迟初始化,首次使用时才创建连接池
        lazy: true
        driver-class-name: org.postgresql.Driver
        type: ${spring.datasource.type}
    # Hikari 连接池配置(完整配置请参阅:https://github.com/brettwooldridge/HikariCP)
    hikari:
      # 最大连接数量(默认 10,根据实际环境调整)
      # 注意:当连接达到上限,并且没有空闲连接可用时,获取连接将在超时前阻塞最多 connectionTimeout 毫秒
      maximum-pool-size: 20
      # 获取连接超时时间(默认 30000 毫秒,30 秒)
      connection-timeout: 30000
      # 空闲连接最大存活时间(默认 600000 毫秒,10 分钟)
      idle-timeout: 600000
      # 保持连接活动的频率,以防止它被数据库或网络基础设施超时。该值必须小于 maxLifetime(默认 0,禁用)
      keepaliveTime: 30000
      # 连接最大生存时间(默认 1800000 毫秒,30 分钟)
      max-lifetime: 1800000

温馨提示

  1. 生产环境建议关闭 p6spy,以避免性能损耗
  2. 上方配置以 PostgreSQL 为从库示例,请根据你的实际业务需要调整
  3. 可根据实际业务需求添加更多数据源配置(如 slave_2、oracle_db 等)

步骤 3:调整 MyBatis Plus 配置

修改 application.yml 文件中的 MyBatis Plus 配置,移除数据库类型指定,以支持多数据源。

continew-server/application.yml
yaml
--- ### MyBatis Plus 配置
mybatis-plus:
  ## 扩展配置
  extension:
    enabled: true
    # 分页插件配置
    pagination:
      enabled: true
      db-type:  

步骤 4:使用多数据源

完成以上配置后,即可在代码中使用 @DS 注解切换数据源。

4.1 类级别切换

在 Service 类上添加 @DS 注解,指定该类的所有方法使用的数据源:

java
@Service
@DS("slave_1")  // 类级别指定默认使用 slave_1 数据源
public class UserServiceImpl implements UserService {
  // 方法实现...
}

4.2 方法级别切换

在具体方法上添加 @DS 注解,可以覆盖类级别指定的数据源:

java
@Service
@DS("master")  // 类级别默认使用 master 数据源
public class UserServiceImpl implements UserService {

  @Autowired
  private JdbcTemplate jdbcTemplate;

  @Override
  @DS("slave_1")  // 方法级别覆盖,使用 slave_1 数据源
  public List<Map<String, Object>> selectByCondition() {
    return jdbcTemplate.queryForList("select * from sys_user where age > 10");
  }
}

参考资料

1.多数据源支持 | MyBatis-Plus:https://baomidou.com/guides/dynamic-datasource/