Spring Boot 雙數(shù)據(jù)源配置及實(shí)現(xiàn)原理
Spring Boot配置和使用兩個(gè)數(shù)據(jù)源的實(shí)現(xiàn)步驟
什么是雙數(shù)據(jù)源?
雙數(shù)據(jù)源是指在一個(gè)應(yīng)用程序中同時(shí)配置和使用兩個(gè)不同的數(shù)據(jù)庫(kù)連接。比如:
- 一個(gè)連接訂單數(shù)據(jù)庫(kù),處理業(yè)務(wù)數(shù)據(jù)
- 一個(gè)連接用戶中心數(shù)據(jù)庫(kù),處理用戶信息
這樣的架構(gòu)設(shè)計(jì)可以實(shí)現(xiàn)數(shù)據(jù)隔離、業(yè)務(wù)分離,提升系統(tǒng)的可維護(hù)性和擴(kuò)展性。
實(shí)現(xiàn)原理基于 AbstractRoutingDataSource 動(dòng)態(tài)切換。
為什么需要雙數(shù)據(jù)源?
1. 業(yè)務(wù)分離
不同的業(yè)務(wù)模塊使用獨(dú)立的數(shù)據(jù)庫(kù),職責(zé)更加明確:
訂單系統(tǒng) → 訂單數(shù)據(jù)庫(kù)(存儲(chǔ)訂單、商品、支付信息) 用戶系統(tǒng) → 用戶數(shù)據(jù)庫(kù)(存儲(chǔ)用戶、權(quán)限、組織信息)
2. 性能優(yōu)化
- 分散數(shù)據(jù)庫(kù)負(fù)載,避免單點(diǎn)壓力
- 可以針對(duì)不同業(yè)務(wù)特點(diǎn)優(yōu)化數(shù)據(jù)庫(kù)配置
3. 數(shù)據(jù)安全
- 敏感數(shù)據(jù)隔離存儲(chǔ)
- 不同數(shù)據(jù)源可以設(shè)置不同的訪問權(quán)限
核心實(shí)現(xiàn)原理
雙數(shù)據(jù)源的核心是 Spring 的 AbstractRoutingDataSource(用于動(dòng)態(tài)切換數(shù)據(jù)源),它可以根據(jù)某個(gè)鍵值動(dòng)態(tài)選擇不同的數(shù)據(jù)源:
Spring 每次訪問數(shù)據(jù)庫(kù)前,都會(huì)先執(zhí)行 determineCurrentLookupKey方法 來判斷用哪個(gè)數(shù)據(jù)源。我們通過 AOP 切面,在執(zhí)行方法前設(shè)置好對(duì)應(yīng)的數(shù)據(jù)源,就能實(shí)現(xiàn)動(dòng)態(tài)切換。
配置好雙數(shù)據(jù)源后,訪問另一個(gè)數(shù)據(jù)庫(kù)的方式和訪問本地?cái)?shù)據(jù)庫(kù)幾乎一樣,開發(fā)時(shí)感知不到差異。
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
// 返回當(dāng)前線程需要使用的數(shù)據(jù)源標(biāo)識(shí)
return DataSourceContextHolder.getDataSourceType();
}
}完整示例
https://github.com/yikousu/DataSwitch
注意
普通的 @Transactional 注解無法跨數(shù)據(jù)源生效!
解決方案:
推薦:同一業(yè)務(wù)盡量只操作一個(gè)數(shù)據(jù)源
如必須跨庫(kù):考慮使用分布式事務(wù)框架
到此這篇關(guān)于Spring Boot 雙數(shù)據(jù)源配置的文章就介紹到這了,更多相關(guān)Spring Boot 雙數(shù)據(jù)源內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java代理模式(Proxy)實(shí)現(xiàn)方法詳解
這篇文章主要介紹了Java代理模式(Proxy)實(shí)現(xiàn)的相關(guān)資料,代理模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,通過引入代理對(duì)象來控制對(duì)目標(biāo)對(duì)象的訪問,代理模式的優(yōu)點(diǎn)包括職責(zé)清晰、擴(kuò)展性好、保護(hù)目標(biāo)對(duì)象和增強(qiáng)功能,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-04-04
面試官:詳細(xì)談?wù)凧ava對(duì)象的4種引用方式
這篇文章主要給大家介紹了java面試官常會(huì)問到的,關(guān)于Java對(duì)象的4種引用方式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
SpringMVC JSON數(shù)據(jù)交互及RESTful支持實(shí)現(xiàn)方法
這篇文章主要介紹了SpringMVC JSON數(shù)據(jù)交互及RESTful支持實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
MyBatis標(biāo)簽之Select?resultType和resultMap詳解
這篇文章主要介紹了MyBatis標(biāo)簽之Select?resultType和resultMap,在MyBatis中有一個(gè)ResultMap標(biāo)簽,它是為了映射select標(biāo)簽查詢出來的結(jié)果集,下面使用一個(gè)簡(jiǎn)單的例子,來介紹 resultMap 的使用方法,需要的朋友可以參考下2022-09-09
SpringSecurity?表單登錄的實(shí)現(xiàn)
本文主要介紹了SpringSecurity?表單登錄的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
Geotools實(shí)現(xiàn)shape文件的寫入功能
Geotools作為開源的Java?GIS三方庫(kù),已經(jīng)成為GIS服務(wù)器端的主流開源庫(kù),其功能非常強(qiáng)大,涉及到GIS業(yè)務(wù)的方方面面,其中就包括GIS數(shù)據(jù)的讀寫,今天小編就借助Geotools來實(shí)現(xiàn)shape數(shù)據(jù)的寫入,需要的朋友可以參考下2023-08-08
javaWeb實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了javaWeb實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01

