SpringBoot集成MySQL - MyBatis 多个数据源
前文介绍的SpringBoot集成单个MySQL数据库的情形,那么什么场景会使用多个数据源以及什么场景会需要多个数据源的动态切换呢?本文主要介绍上述场景及SpringBoot+MyBatis实现多个数据源的方案和示例。@javaxue
知识准备
需要了解多数据源出现的场景和对应的多数据源集成思路。@javaxue
什么场景会出现多个数据源?
一般而言有如下几种出现多数据源的场景。
- 场景一:不同的业务涉及的表位于不同的数据库
随着业务的拓展,模块解耦,服务化的拆分等,不同的业务涉及的表会放在不同的数据库中。
- 场景二:主库和从库分离(读写分离)
主从分离等相关知识请参考这篇文章: MySQL - 主从复制与读写分离
- 场景三:数据库的分片
数据库的分片相关知识和方案请参考:SpringBoot集成MySQL - 分库分表ShardingJDBC
- 场景四:多租户隔离
所有数据库表结构一致,只是不同客户的数据放在不同数据库中,通过数据库名对不同客户的数据隔离。这种场景有一个典型的叫法:多租户。
PS:除了这种多租户除了用不同的数据库隔离不同客户数据外,还会通过额外的表字段隔离(比如tenant_id字段,不同的tenant_id表示不同的客户),对应的实现方式和案例可以参考SpringBoot集成MySQL - MyBatis-Plus基于字段隔离的多租户
常见的多数据源的实现思路?
应对上述出现的场景,多数据源方式如何实现呢?
- 针对场景一:不同的业务涉及的表位于不同的数据库
首先,出现这种场景且在一个模块中设计多数据源时,需要考虑当前架构的合理性,因为从设计的角度而言不同的业务拆分需要对应着不同的服务/模块。
其次,我们会考虑不同的package去隔离,不同的数据源放在不同的包下的代码中。
- 针对场景二:主库和从库分离(读写分离)
这种场景下我们叫动态数据源,通常方式使用AOP方式拦截+ThreadLocal切换。(本文的示例主要针对这种场景)
简单示例
https://blog.csdn.net/tuesdayma/article/details/81081666
进一步理解
示例源码
https://github.com/realpdai/tech-javaxue-spring-demos