1. 为什么我们需要多数据源解决方案
在真实的业务开发中,单数据源往往无法满足复杂场景的需求。我经历过一个电商项目,高峰期订单库查询量达到每秒5000+,导致主库频繁告警。这时我们意识到必须引入读写分离机制——这就是dynamic-datasource-spring-boot-starter这类工具的价值所在。
多数据源场景主要分为三类:
- 垂直分库:按业务模块拆分(如订单库、用户库)
- 水平扩展:读写分离、主从架构
- 混合模式:既有业务分库又有读写分离
传统JDBC配置多数据源需要手动维护多个DataSource实例,事务管理复杂。而dynamic-datasource通过starter方式,用注解驱动实现了声明式数据源切换。其核心原理可以理解为对Spring原生AbstractRoutingDataSource的增强封装。
2. 核心架构解析
2.1 整体设计思想
这个starter的设计遵循了SpringBoot的"约定优于配置"原则。启动时会自动加载配置文件中所有以下划线分组的数据源,并构建一个路由数据源(RoutingDataSource)。关键类结构如下:
java复制public class DynamicRoutingDataSource extends AbstractRoutingDataSource {
// 实际执行数据源切换的方法
protected Object determineCurrentLookupKey() {
return DynamicDataSourceContextHolder.peek();
}
// 动态增删数据源的方法
public synchronized void addDataSource(String dsName, DataSource dataSource){...}
}
2.2 关键特性实现原理
动态数据源管理:
- 通过
DynamicDataSourceProvider接口加载初始数据源 - 使用
ConcurrentHashMap缓存所有数据源实例 - 提供
DynamicDataSourceCreator支持Druid/HikariCP等
