背景与目标
当系统数据量过大,性能问题逐渐浮出水面时,采用主从模式是一个稳妥的选择。业务写入走主库,查询走从库,既能保障业务不受影响,又能提升读取性能。此时,程序需要支持动态多数据源配置。
依赖引入
首先需要在项目中引入 dynamic-datasource-spring-boot-starter 组件。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.2.1</version>
</dependency>
配置数据源
数据库配置项较多,为了便于维护和管理,建议将配置集中管理。实践中我倾向于在 Apollo 中创建名为 spring-datasource 的 Namespace 来存放这些配置。
核心配置如下:
# 开启多数据源模式
spring.datasource.dynamic.enabled = true
# 指定默认主库
spring.datasource.dynamic.primary = master
# 主库配置
spring.datasource.dynamic.datasource.master.type = com.zaxxer.hikari.HikariDataSource
spring.datasource.dynamic.datasource.master.driver-class-name = com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.master.url = jdbc:mysql://10.0.x.x:3306/mydb?characterEncoding=UTF-8&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
spring.datasource.dynamic.datasource.master.username = mydb
spring.datasource.dynamic.datasource.master.password = mydbp@ssword
spring.datasource.dynamic.datasource.master.hikari.max-pool-size = 17
spring.datasource.dynamic.datasource.master.hikari.min-idle = 17
# 从库配置
spring.datasource.dynamic.datasource.slave.type = com.zaxxer.hikari.HikariDataSource
spring.datasource.dynamic.datasource.slave.driver-class-name = com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.slave.url = jdbc:mysql://10.12.x.x:30020/mydb?characterEncoding=UTF-8&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
spring.datasource.dynamic.datasource.slave.username = read
spring.datasource.dynamic.datasource.slave.password = readp@ssword
spring.datasource.dynamic.datasource.slave.hikari.max-pool-size = 5
spring.datasource.dynamic.datasource.slave.hikari.min-idle = 5
注意:原配置中使用了
com.mysql.jdbc.Driver,这在较新版本的 MySQL 驱动中已被标记为废弃,建议改为com.mysql.cj.jdbc.Driver。


