当前位置: 首页 > news >正文

Spring Boot 双数据源配置

文章目录

    • 什么是双数据源?
    • 为什么需要双数据源?
    • 核心实现原理
    • 完整示例
    • 注意

什么是双数据源?

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

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

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

实现原理基于 AbstractRoutingDataSource 动态切换。

为什么需要双数据源?

1. 业务分离
不同的业务模块使用独立的数据库,职责更加明确:

订单系统 → 订单数据库(存储订单、商品、支付信息)
用户系统 → 用户数据库(存储用户、权限、组织信息)

2. 性能优化

  • 分散数据库负载,避免单点压力
  • 可以针对不同业务特点优化数据库配置

3. 数据安全

  • 敏感数据隔离存储
  • 不同数据源可以设置不同的访问权限

核心实现原理

双数据源的核心是 Spring 的 AbstractRoutingDataSource(用于动态切换数据源),它可以根据某个键值动态选择不同的数据源:

Spring 每次访问数据库前,都会先执行 determineCurrentLookupKey方法 来判断用哪个数据源。我们通过 AOP 切面,在执行方法前设置好对应的数据源,就能实现动态切换。

配置好双数据源后,访问另一个数据库的方式和访问本地数据库几乎一样,开发时感知不到差异。

public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {// 返回当前线程需要使用的数据源标识return DataSourceContextHolder.getDataSourceType();}
}

完整示例

https://github.com/yikousu/DataSwitch

注意

普通的 @Transactional 注解无法跨数据源生效!

解决方案:

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

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

http://www.lryc.cn/news/588265.html

相关文章:

  • RPC vs RESTful架构选择背后的技术博弈
  • SecretFlow 隐语 (2) --- 隐语架构概览
  • 【安卓笔记】进程和线程的基础知识
  • Ubuntu20.05上安装Clang 15
  • 【安卓笔记】线程基本使用:锁、锁案例
  • 新型eSIM攻击技术可克隆用户资料并劫持手机身份
  • linux 内核: 访问当前进程的 task_struct
  • [论文阅读] 人工智能 + 软件工程 | 用大语言模型+排名机制,让代码评论自动更新更靠谱
  • android Perfetto cpu分析教程及案例
  • 迁移学习之图像预训练理解
  • ICML 2025 | 从语言到视觉,自回归模型VARSR开启图像超分新范式
  • C# TCP粘包与拆包深度了解
  • CSP-S 模拟赛 17
  • 哈希扩展 --- 海量数据处理
  • 一文明白AI、AIGC、LLM、GPT、Agent、workFlow、MCP、RAG概念与关系
  • Linux操作系统从入门到实战(七)详细讲解编辑器Vim
  • 螺旋模型:风险分析驱动的渐进式开发
  • C++卸载了会影响电脑正常使用吗?解析C++运行库的作用与卸载后果
  • 什么是实时数仓?实时数仓又有哪些应用场景?
  • 疯狂星期四 - 第7天运营日报
  • 多线程/协程环境时间获取的“时间片陷阱“:深度解析与工程级解决方案
  • 16.避免使用裸 except
  • Sharding-Sphere学习专题(一)基础认识
  • sshpass原理详解及自动化运维实践
  • xss-lab靶场通关
  • GD32/STM32嵌入CMSIS-DSP的库(基于Keil)
  • 系统思考:跨境跨界团队学习
  • 后端接口通用返回格式与异常处理实现
  • Flask服务器公外网访问,IPv6(亲测有效!!!!)
  • 8.数据库索引