image.png多数据源(读写分离)

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

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

    1. 数据连接池

    ```xml com.alibaba druid-spring-boot-starter
  1. <a name="lxbDT"></a>
  2. ### 1.1 Druid 监控配置
  3. 在 application-local.yaml配置文件中,通过 spring.datasource.druid 配置项,仅仅设置了 Druid **监控**相关的配置项目,具体数据库的设置需要使用 Dynamic Datasource 的配置项。如下图所示:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/28522586/1652262642911-a344d675-a56f-43fa-9da1-3a43253300ff.png#clientId=uc3f51303-b1b2-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u55016fa0&margin=%5Bobject%20Object%5D&name=image.png&originHeight=536&originWidth=667&originalType=url&ratio=1&rotation=0&showTitle=false&size=88914&status=done&style=none&taskId=ue0551184-800d-4e7f-a3c7-c463455bf38&title=)
  4. <a name="qtQg1"></a>
  5. ### 1.2 Druid 监控界面
  6. ① 访问后端的 /druid/index.html 路径,例如说本地的 http://127.0.0.1:48080/druid/index.html 地址,可以查看到 Druid 监控界面。如下图所示:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/28522586/1652863102503-8eec6a95-df7c-49bb-8f1f-0b42eda0358a.png#clientId=u694382f2-5bac-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=873&id=u43ec2ad2&margin=%5Bobject%20Object%5D&name=image.png&originHeight=873&originWidth=1908&originalType=binary&ratio=1&rotation=0&showTitle=false&size=103997&status=done&style=none&taskId=u1ff196b4-6e6e-44f2-b416-5d5df1ca46c&title=&width=1908)<br />② 访问前端的 [基础设施 -> MySQL 监控] 菜单,也可以查看到 Druid 监控界面。如下图所示:
  7. <a name="p8JtN"></a>
  8. ## 2. 多数据源
  9. ```xml
  10. <dependency>
  11. <groupId>com.baomidou</groupId>
  12. <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
  13. </dependency>

2.1 多数据源配置

在 application-local.yaml配置文件中,通过 spring.datasource.dynamic 配置项,配置了 Master-Slave 主从两个数据源。如下图所示:
image.png

2.2 数据源切换

2.2.1 @Master 注解

在方法上添加 @Master注解,使用名字为 master 的数据源,即使用【主】库,一般适合【写】场景。示例如下图:
image.png
由于项目的 spring.datasource.dynamic.primary 为 master,默认使用【主】库,所以无需手动添加 @Master 注解。

2.2.2 @Slave 注解

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

2.2.3 @DS 注解

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

2.3 分布式事务

在使用 Spring @Transactional 声明的事务中,无法进行数据源的切换,此时有 3 种解决方案:
① 拆分成多个 Spring 事务,每个事务对应一个数据源。如果是【写】场景,可能会存在多数据源的事务不一致的问题。
② 引入 Seata 框架,提供完整的分布式事务的解决方案。
③ 使用 Dynamic Datasource 提供的 @DSTransactional注解,支持多数据源的切换,不提供绝对可靠的多数据源的事务一致性(强于 ① 弱于 ②)。

3. 分库分表

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