Skip to content

多数据源

ContiNew Admin 自 v3.4.0 版本(ContiNew Starter v2.7.1)开始,移除了多数据源组件,再次降低上手成本。

如果你有需要,可以查看对应提交记录,根据提交记录逆向还原改动,即可恢复多数据源模式。下方将演示基于 MyBatis Plus ORM 框架引入多数据源的步骤。

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

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

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&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&autoReconnect=true&maxReconnects=10&failOverReadOnly=false
        username: ${DB_USER:root}
        password: ${DB_PWD:123456}
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: ${spring.datasource.type}
      # 从库配置(可配多个,构成多从)
      slave_1:
        url: jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:continew_admin}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&rewriteBatchedStatements=true&autoReconnect=true&maxReconnects=10&failOverReadOnly=false
        username:
        password:
        lazy: true
        driver-class-name: com.mysql.cj.jdbc.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

3.修改 application.yml 中的 MyBatis Plus 配置,移除数据库类型指定。

yaml
--- ### MyBatis Plus 配置
mybatis-plus:
  ## 扩展配置
  extension:
    enabled: true
    # Mapper 接口扫描包配置
    mapper-package: ${project.base-package}.**.mapper
    # ID 生成器配置
    id-generator:
      type: COSID
    # 数据权限配置
    data-permission:
      enabled: true
    # 分页插件配置
    pagination:
      enabled: true
      db-type:  

4.操作完上方步骤后即完成了多数据源的引入,可以使用 @DS 切换数据源。

java
@Service
@DS("slave")
public class UserServiceImpl implements UserService {

  @Autowired
  private JdbcTemplate jdbcTemplate;

  @Override
  @DS("slave_1")
  public List selectByCondition() {
    return jdbcTemplate.queryForList("select * from user where age > 10");
  }
}

参考资料

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