切换为多数据源
ContiNew Admin 在 v3.4.0 版本(对应 ContiNew Starter v2.7.1)中移除了默认集成的多数据源组件,旨在降低新项目的上手成本和简化配置复杂度。
若你的业务场景需要使用多数据源功能,可以通过以下两种方式实现:
- 参考提交记录逆向还原多数据源相关代码
- 按照本文档所述步骤重新引入多数据源功能
本文将介绍如何基于 MyBatis Plus ORM 框架重新集成多数据源功能。
步骤 1:引入依赖
首先,在 continew-common/pom.xml
引入多数据源依赖。(不需要声明版本,在 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&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
温馨提示
- 生产环境建议关闭 p6spy,以避免性能损耗
- 上方配置以 PostgreSQL 为从库示例,请根据你的实际业务需要调整
- 可根据实际业务需求添加更多数据源配置(如 slave_2、oracle_db 等)
步骤 3:调整 MyBatis Plus 配置
修改 application.yml
文件中的 MyBatis Plus 配置,移除数据库类型指定,以支持多数据源。
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/