文章目錄
- 什么是雙數據源?
- 為什么需要雙數據源?
- 核心實現原理
- 完整示例
- 注意
什么是雙數據源?
雙數據源是指在一個應用程序中同時配置和使用兩個不同的數據庫連接。比如:
- 一個連接訂單數據庫,處理業務數據
- 一個連接用戶中心數據庫,處理用戶信息
這樣的架構設計可以實現數據隔離、業務分離,提升系統的可維護性和擴展性。
實現原理基于 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 注解無法跨數據源生效!
解決方案:
-
推薦:同一業務盡量只操作一個數據源
-
如必須跨庫:考慮使用分布式事務框架