Spring Boot 双数据源配置

文章目录

什么是双数据源?

双数据源是指在一个应用程序中同时配置和使用两个不同的数据库连接。比如:

  • 一个连接订单数据库,处理业务数据
  • 一个连接用户中心数据库,处理用户信息

这样的架构设计可以实现数据隔离、业务分离,提升系统的可维护性和扩展性。

实现原理基于 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 注解无法跨数据源生效!

解决方案:

  • 推荐:同一业务尽量只操作一个数据源

  • 如必须跨库:考虑使用分布式事务框架

相关推荐
云技纵横3 分钟前
@Transactional 里套 REQUIRES_NEW,为什么会把连接池耗尽?
后端·面试
tcdos9 分钟前
不止扫码 — 微信生态深度融合(登录 + 支付 + 消息)
后端·微信小程序
程序员cxuan12 分钟前
Anthropic 大面积封号,连大 V 都忍不了开喷了。
人工智能·后端·程序员
MacroZheng23 分钟前
短短几天,暴涨2.8万Star!又一款编程神器开源!
java·人工智能·后端
PinkSun26 分钟前
平台线程池用了3年很顺手,换成虚拟线程后我后悔了
后端
达达尼昂30 分钟前
Claude : 如何设计可控的agent-loops
前端·人工智能·后端
lambdax32 分钟前
Celery 心跳任务内存膨胀排查与修复全记录
后端
SamDeepThinking35 分钟前
函数式编程:用BiFunction消除多类型分支的代码重复
java·后端·面试
IT_陈寒1 小时前
Redis持久化丢失数据的坑,这次终于被我填平了
前端·人工智能·后端
葫芦和十三2 小时前
图解 MongoDB 24|分片为什么存在:垂直扩容的天花板
后端·mongodb·agent