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

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

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

黑客发布于 2024/12/23更新于 2026/7/2545 浏览
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. 几点说明
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 电池管理系统 BMS 三级架构:BMU、BCU 与 BAU 详解
  • AI 大模型在短视频处理和剪辑中的应用
  • Go Channel 深入解析:状态、底层原理与工程实践
  • Linux 内核配置添加 WiFi 驱动和固件
  • 基于 HomeAssistant 实现跨品牌智能家居联动
  • Python生成器函数深度解析:asyncio事件循环底层实现与异步编程实战
  • OpenClaw 对接飞书机器人高频踩坑与解决方案
  • 基于射频和深度学习的无人机检测识别与开源数据库构建
  • Stable Diffusion WebUI 启动报错:MessageFactory GetPrototype 修复方案
  • Windows 10 本地部署 DataX 与 DataX-Web
  • 本地大模型助手 Chatbox 安装、配置与应用指南
  • PyCharm Linux 安装与使用指南
  • 深入理解 Xilinx FPGA 开发:Vivado 与 Vitis 流程对比
  • 长亭 Xray Web 漏洞扫描器:从入门到实战
  • 宇树 G1 机器人强化学习训练环境配置与奖励函数解析
  • 大模型返回 JSON 结构数据的技术方案对比与选择
  • DAMO-YOLO 目标检测部署:深色模式与异步渲染的工业 Web 方案
  • Dreamify 免费 AI 绘画工具的功能与实现
  • AIGC 工具全解析:文本、图像、代码、视频及音频生成指南
  • TensorFlow 安装教程

相关免费在线工具

  • 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