1. MyBatis-Plus多数据源配置实战指南
在企业级应用开发中,多数据源配置是一个常见需求。无论是读写分离、业务分库还是多租户架构,都需要我们掌握高效的数据源切换方案。MyBatis-Plus作为MyBatis的增强工具,提供了简洁而强大的多数据源支持,本文将深入解析其实现原理和最佳实践。
1.1 多数据源的典型应用场景
在实际项目中,我们通常会遇到以下几种需要多数据源的场景:
-
读写分离:将数据库的读操作和写操作分离到不同的数据库实例,这是提升系统性能的经典方案。主库负责处理所有写操作(INSERT/UPDATE/DELETE),而从库则处理读操作(SELECT)。这种架构可以有效减轻主库压力,提高系统整体吞吐量。
-
业务分库:随着业务规模扩大,单一数据库可能无法满足性能需求。按照业务模块将数据分散到不同的数据库,比如用户数据、订单数据、商品数据分别存储,可以降低单库压力,提高系统扩展性。
-
多租户架构:在SaaS应用中,不同租户的数据需要严格隔离。为每个租户分配独立的数据库是最彻底的隔离方案,既能保证数据安全,又便于单独备份和恢复。
-
异构数据库集成:某些特殊场景下,我们可能需要同时访问不同类型的数据库,比如MySQL和PostgreSQL,甚至是非关系型数据库。多数据源配置让这种混合架构成为可能。
1.2 MyBatis-Plus多数据源方案选型
MyBatis-Plus提供了两种主要的多数据源实现方式:
动态数据源方案:
- 基于Spring的AbstractRoutingDataSource实现
- 通过ThreadLocal保存当前线程的数据源标识
- 支持运行时动态切换数据源
- 使用@DS注解或编程方式控制数据源选择
- 官方推荐方案,配置简单,灵活性高
多SqlSessionFactory方案:
- 为每个数据源配置独立的SqlSessionFactory
- 数据源在编译时确定,缺乏灵活性
- 需要手动管理不同数据源对应的Mapper
- 适合数据源固定不变的简单场景
对于大多数现代应用,动态数据源方案是更好的选择。它不仅配置简单,还能满足运行时动态切换的需求,特别适合需要弹性扩展的场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 动态数据源配置详解
2.1 环境准备与依赖配置
首先需要在项目中引入dynamic-datasource-spring-boot-starter依赖。这是一个基于Spring Boot的starter,可以简化配置过程。
xml复制<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
注意:版本号应根据实际需求选择,建议使用最新稳定版。同时确保项目中已经正确配置了Spring Boot和MyBatis-Plus的基础依赖。
2.2 多数据源基础配置
在application.yml中配置多数据源的基本信息:
yaml复制spring:
datasource:
dynamic:
primary: master # 设置默认数据源
strict: false # 是否严格匹配数据源,未匹配到时使用默认数据源
datasource:
master: # 主数据源配置
url: jdbc:mysql://localhost:3306/master_db?useSSL=false&characterEncoding=utf8
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
slave1: # 从数据源1
url: jdbc:mysql://localhost:3307/slave_db?useSSL=false&characterEncoding=utf8
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
slave2: # 从数据源2
url: jdbc:mysql://localhost:3308/slave_db?useSSL=false&characterEncoding=utf8
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
配置说明:
primary指定了默认数据源,当没有明确指定数据源时,系统会使用这个默认值strict模式控制当指定数据源不存在时的行为:true表示抛出异常,false表示回退到默认数据源- 每个数据源需要配置完整的连接信息,包括url、用户名、密码和驱动类
2.3 @DS注解的使用方法
@DS是动态数据源的核心注解,可以用在类或方法上,用于指定数据源。
类级别使用:
java复制@Service
@DS("slave") // 该类所有方法默认使用slave数据源
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
// 方法实现...
}
方法级别使用:
java复制@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {
@DS(
