econets-vue开发指南 econets-vue开发指南
首页
  • 萌新必读
  • 后端手册
  • 中间件手册
  • 工作流手册
  • 工作流手册
  • 大屏手册
  • 支付手册
  • 会员手册
  • 商城手册
  • 公众号手册
  • CRM手册
  • 运维手册
GitHub (opens new window)
首页
  • 萌新必读
  • 后端手册
  • 中间件手册
  • 工作流手册
  • 工作流手册
  • 大屏手册
  • 支付手册
  • 会员手册
  • 商城手册
  • 公众号手册
  • CRM手册
  • 运维手册
GitHub (opens new window)
  • 萌新必读

    • 简介
    • 功能列表
    • 快速启动(后端项目)
    • 快速启动(前端项目)
    • 技术选型
    • 项目结构
    • 代码热加载
    • 一键改包
    • 删除功能
    • 内网穿透
  • 后端手册

    • 新建服务
    • 代码生成【单表】(新增功能)
    • 代码生成【主子表】
    • 代码生成(树表)
    • 功能权限
    • 数据权限
    • 用户体系
    • 三方登录
    • OAuth 2.0(SSO 单点登录)
    • SaaS 多租户【字段隔离】
    • SaaS 多租户【数据库隔离】
    • WebSocket 实时通信
    • 13异常处理(错误码)
    • 参数校验
    • 分页实现
    • 文件存储(上传下载)
    • Excel 导入导出
    • 系统日志
    • MyBatis 数据库
    • MyBatis 联表&分页查询
    • 多数据源(读写分离)
      • 1. 数据连接池
        • 1.1 Druid 监控配置
        • 1.2 Druid 监控界面
      • 2. 多数据源
        • 2.1 多数据源配置
        • 2.2 数据源切换
        • 2.2.1 @Master 注解
        • 2.2.2 @Slave 注解
        • 2.2.3 @DS 注解
        • 2.3 分布式事务
      • 3. 分库分表
    • Redis 缓存
    • 本地缓存
    • 异步任务
    • 配置管理
    • 工具类 Util
    • 单元测试
    • 分布式锁
    • 幂等性(防重复提交)
    • 数据库文档
    • 验证码
  • 中间件手册

    • 定时任务
    • 消息队列(内存)
    • 消息队列(Redis)
    • 消息队列(RocketMQ)
    • 消息队列(RabbitMQ)
    • 消息队列(Kafka)
    • 限流熔断
  • 工作流手册

    • 工作流(Flowable)会签、或签
  • 指南
  • 后端手册
EcoNets Tech
2024-01-21
目录

多数据源(读写分离)

blossom-spring-boot-starter-mybatis (opens new window)技术组件,除了提供 MyBatis 数据库操作,还提供了如下 2 种功能:

  • 数据连接池:基于 Alibaba Druid (opens new window)实现,额外提供监控的能力。
  • 多数据源(读写分离):基于 Dynamic Datasource (opens new window)实现,支持 Druid 连接池,可集成 Seata (opens new window)实现分布式事务。

# 1. 数据连接池

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
</dependency>

# 1.1 Druid 监控配置

在 application-dev.yaml (opens new window)配置文件中,通过 spring.datasource.druid 配置项,仅仅设置了 Druid 监控相关的配置项目,具体数据库的设置需要使用 Dynamic Datasource 的配置项。如下图所示:

doc_econets_pic_114.png

# 1.2 Druid 监控界面

① 访问后端的 /druid/index.html 路径,例如说本地的 http://127.0.0.1:58080/druid/index.html 地址,可以查看到 Druid 监控界面。如下图所示:

doc_econets_pic_115.png

② 访问前端的 [基础设施 -> MySQL 监控] 菜单,也可以查看到 Druid 监控界面。如下图所示:

doc_econets_pic_116.png

补充说明:

前端 [基础设施 -> MySQL 监控] 菜单,通过 iframe 内嵌后端的 /druid/index.html 路径。

如果你想自定义地址,可以前往 [基础设置 -> 配置管理] 菜单,设置 key 为 url.druid 配置项

# 2. 多数据源

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
</dependency>

# 2.1 多数据源配置

在 application-dev.yaml (opens new window)配置文件中,通过 spring.datasource.dynamic 配置项,配置了 Master-Slave 主从两个数据源。如下图所示:

doc_econets_pic_117.png

# 2.2 数据源切换

# 2.2.1 @Master 注解

在方法上添加 @Master (opens new window)注解,使用名字为 master 的数据源,即使用【主】库,一般适合【写】场景。示例如下图:

doc_econets_pic_118.png

由于项目的 spring.datasource.dynamic.primary 为 master,默认使用【主】库,所以无需手动添加 @Master 注解。

# 2.2.2 @Slave 注解

在方法上添加 @Slave (opens new window)注解,使用名字为 slave 的数据源,即使用【从】库,一般适合【读】场景。示例如下图:

doc_econets_pic_119.png

# 2.2.3 @DS 注解

在方法上添加 @DS (opens new window)注解,使用指定名字的数据源,适合多数据源的情况。示例如下图:

doc_econets_pic_120.png

# 2.3 分布式事务

在使用 Spring @Transactional 声明的事务中,无法进行数据源的切换,此时有 3 种解决方案:

① 拆分成多个 Spring 事务,每个事务对应一个数据源。如果是【写】场景,可能会存在多数据源的事务不一致的问题。

② 引入 Seata 框架,提供完整的分布式事务的解决方案。

③ 使用 Dynamic Datasource 提供的 @DSTransactional (opens new window)注解,支持多数据源的切换,不提供绝对可靠的多数据源的事务一致性(强于 ① 弱于 ②),可学习 《DSTransactional 实现源码分析 》 (opens new window)文章。

# 3. 分库分表

建议采用 ShardingSphere 的子项目 Sharding-JDBC 完成分库分表的功能。

上次更新: 2024/01/22, 14:52:20
MyBatis 联表&分页查询
Redis 缓存

← MyBatis 联表&分页查询 Redis 缓存→

Theme by Vdoing | Copyright © 2019-2024 EcoNets Tech | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式