跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

SpringBoot 集成 MyBatis-Plus Dynamic-Datasource 实现主从多数据源

针对系统数据量大导致的性能瓶颈,基于 SpringBoot 和 MyBatis-Plus Dynamic-Datasource 组件构建主从多数据源的方案。通过配置主库与从库连接信息,利用 @DS 注解在类或方法级别动态切换数据源,实现读写分离。文中详细说明了依赖引入、配置文件编写(含 Apollo 实践)、启动日志验证以及关键配置项注意事项,如 primary 指定和 Hikari 属性命名差异,帮助开发者快速落地多数据源架构。

黑客发布于 2024/12/23更新于 2026/9/1078 浏览
SpringBoot 集成 MyBatis-Plus Dynamic-Datasource 实现主从多数据源

背景与目标

当系统数据量过大,性能问题逐渐浮出水面时,采用主从模式是一个稳妥的选择。业务写入走主库,查询走从库,既能保障业务不受影响,又能提升读取性能。此时,程序需要支持动态多数据源配置。

依赖引入

首先需要在项目中引入 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

使用方式

在 Service 层 Bean 或具体方法上使用 @DS 注解即可指定数据源。如果不指定,默认会走主库。

方式一:在类级别指定 适用于整个 Service 类的所有操作都走特定数据源。

@Service
@DS("slave")
public class TidbUserSignManager extends ServiceImpl<UserSignMapper, UserSign> {
    // ...
}

方式二:在方法级别指定 适用于单个查询方法需要走从库的场景。

@DS("slave")
public int invoiceCount() {
    return testMapper.mysqlInvoiceCount();
}

启动验证

服务启动后,观察日志可以看到各数据源的初始化情况。关键信息包括 Hikari 数据源的 Start completed 以及 DynamicRoutingDataSource 加载成功的信息。

INFO com.zaxxer.hikari.HikariDataSource:80 - master - Starting...
INFO com.zaxxer.hikari.HikariDataSource:82 - master - Start completed.
INFO com.zaxxer.hikari.HikariDataSource:80 - slave - Starting...
INFO com.zaxxer.hikari.HikariDataSource:82 - slave - Start completed.
INFO c.b.dynamic.datasource.DynamicRoutingDataSource:132 - dynamic-datasource - load a datasource named [slave] success
INFO c.b.dynamic.datasource.DynamicRoutingDataSource:132 - dynamic-datasource - load a datasource named [master] success
INFO c.b.dynamic.datasource.DynamicRoutingDataSource:237 - dynamic-datasource initial loaded [2] datasource,primary datasource named [master]

几点说明

实际开发中,有几个细节容易踩坑,需要特别注意。

  1. 开关控制:spring.datasource.dynamic.enabled 决定多数据源模式是否开启。默认为 true。如果设置为 false,程序将退化为单数据源模式,此时 @DS 注解失效,所有请求都会直接走主库。
  2. 主库必须指定:必须配置 spring.datasource.dynamic.primary 来指定默认数据源。如果遗漏,启动时会报错提示检查 primary 设置,导致 Bean 创建失败。
  3. Hikari 配置差异:单数据源和多数据源模式下,HikariCP 的属性名有所不同。例如单数据源常用 maximum-pool-size,而在多数据源配置中需使用 max-pool-size;同理 max-life-time 对应 max-lifetime。这一点比较隐蔽,配置错误可能导致连接池参数不生效。

通过以上步骤,即可在 SpringBoot 项目中灵活地实现读写分离和多数据源路由。

目录

  1. 背景与目标
  2. 依赖引入
  3. 配置数据源
  4. 开启多数据源模式
  5. 指定默认主库
  6. 主库配置
  7. 从库配置
  8. 使用方式
  9. 启动验证
  10. 几点说明

更多推荐文章

查看全部
  • Stable Diffusion 与 Z-Image-Turbo 部署对比:推理速度与显存占用评测
  • Effective Modern C++ 条款 37:确保 std::thread 析构前不可结合
  • Python 使用 Flask 实现 DOCX 转 Markdown 及图片提取
  • 基于低代码引擎的企业级审批系统搭建实战
  • C++ 类与对象进阶特性与编译器优化实战
  • VSCode Python 自动补全配置指南
  • 卷积神经网络(CNN)进阶:经典架构解析与实战开发
  • 基于 OpenAI API 的 Python 聊天程序开发指南
  • Higress 网关:REST API 转 MCP Server 配置指南
  • 选择排序算法原理与实现
  • 使用 Java 计算 1 到 20 的阶乘之和
  • 易语言高级进阶:混合编程、系统底层与开源生态
  • 使用 Rokid 灵珠平台搭建旅游 AR 智能体
  • 快速排序:划分方法、优化与非递归实现
  • FPGA 实现 MIPI 协议解析与时序规范
  • Java 环境搭建与首个 Hello World 实战指南
  • SpringBoot 微服务重试机制:主流方案对比与实战集成
  • 如何降低豆包生成论文的 AIGC 检测率?工具实测对比
  • 深度生成模型对比:VAE、GAN、AR、Flow 与 Diffusion 原理及实现
  • OpenCode 本地 AI 模型配置与自托管指南

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online