文章目录
什么是双数据源?
双数据源是指在一个应用程序中同时配置和使用两个不同的数据库连接。比如:
- 一个连接订单数据库,处理业务数据
- 一个连接用户中心数据库,处理用户信息
这样的架构设计可以实现数据隔离、业务分离,提升系统的可维护性和扩展性。
实现原理基于 AbstractRoutingDataSource
动态切换。
为什么需要双数据源?
1. 业务分离
不同的业务模块使用独立的数据库,职责更加明确:
订单系统 → 订单数据库(存储订单、商品、支付信息)
用户系统 → 用户数据库(存储用户、权限、组织信息)
2. 性能优化
- 分散数据库负载,避免单点压力
- 可以针对不同业务特点优化数据库配置
3. 数据安全
- 敏感数据隔离存储
- 不同数据源可以设置不同的访问权限
核心实现原理
双数据源的核心是 Spring 的 AbstractRoutingDataSource
(用于动态切换数据源),它可以根据某个键值动态选择不同的数据源:
Spring 每次访问数据库前,都会先执行 determineCurrentLookupKey方法
来判断用哪个数据源。我们通过 AOP 切面,在执行方法前设置好对应的数据源,就能实现动态切换。
配置好双数据源后,访问另一个数据库的方式和访问本地数据库几乎一样,开发时感知不到差异。
java
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
// 返回当前线程需要使用的数据源标识
return DataSourceContextHolder.getDataSourceType();
}
}
完整示例
https://github.com/yikousu/DataSwitch
注意
普通的 @Transactional 注解无法跨数据源生效!
解决方案:
-
推荐:同一业务尽量只操作一个数据源
-
如必须跨库:考虑使用分布式事务框架