最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mybatis數(shù)據(jù)源切換的幾種方法小結(jié)

 更新時間:2026年07月21日 09:26:50   作者:Ethan0107  
本文清晰對比Mybatis數(shù)據(jù)源切換的4種方案:從硬編碼到AOP注解,再到強大的第三方庫dynamic-datasource,幫你根據(jù)項目規(guī)模快速選型,同時點出事務(wù)中切換數(shù)據(jù)源的大坑,讓你少走彎路

方案一:配置文件 + 硬編碼切換(基礎(chǔ)版)

你提到的第一種方式,是最基礎(chǔ)、最直觀的實現(xiàn)。它的核心流程是:

  1. 配置:在 application.yml 或 mybatis-config.xml 中定義多個數(shù)據(jù)源(如 master, slave1, slave2)。
  2. 持有:在代碼中通過一個工具類(比如使用 ThreadLocal)持有當(dāng)前線程要使用的數(shù)據(jù)源 key。
  3. 切換:在業(yè)務(wù)代碼中,手動調(diào)用工具類的方法(如 DataSourceContextHolder.setDataSource("slave1"))來切換。
維度評價
優(yōu)點簡單直接,容易理解,沒有黑盒。適合業(yè)務(wù)邏輯簡單、數(shù)據(jù)源切換點非常明確的場景。
缺點切換邏輯和業(yè)務(wù)代碼耦合,侵入性強。如果忘記在方法結(jié)束時清除上下文,可能導(dǎo)致后續(xù)邏輯使用了錯誤的數(shù)據(jù)源,產(chǎn)生難以追蹤的 Bug。

方案二:AOP 切面編程(解耦版)

這是對方案一的優(yōu)化,也是目前最常用的實踐。它通過 Spring AOP 將“切換”這個動作從業(yè)務(wù)代碼中抽離出來。

核心邏輯是:定義一個注解(如 @DataSource("slave1")),然后編寫一個切面,攔截所有帶有該注解的方法,在方法執(zhí)行前解析注解并將數(shù)據(jù)源標(biāo)識設(shè)置到 ThreadLocal 中,方法執(zhí)行后在 @After 中清除標(biāo)識。

維度評價
優(yōu)點切換邏輯與業(yè)務(wù)解耦,代碼更干凈。只需在類或方法上加一個注解就能切換,可維護性高,是生產(chǎn)環(huán)境最推薦的實現(xiàn)方式。
缺點需要編寫切面類和注解,有一定學(xué)習(xí)成本。對 AOP 的作用范圍(如 @Transactional 的優(yōu)先級)需要特別注意,避免事務(wù)開啟后再切換數(shù)據(jù)源導(dǎo)致切換失效。

方案三:繼承AbstractRoutingDataSource(動態(tài)路由版)

這是 Spring 提供的官方擴展點,也是實現(xiàn)方案一和方案二的底層基石。

AbstractRoutingDataSource 本身是一個數(shù)據(jù)源,它內(nèi)部管理著一個 Map<Object, Object> 來存放真實數(shù)據(jù)源,并根據(jù) determineCurrentLookupKey() 方法返回的 key 來決定路由到哪個真實數(shù)據(jù)源。我們只需要實現(xiàn)這個方法來返回我們通過 ThreadLocal 設(shè)置的 key 即可。

很多資料和第三方庫(包括 MyBatis-Plus 的 dynamic-datasource)的底層,本質(zhì)上都是對 AbstractRoutingDataSource 的封裝和增強。

方案四:使用第三方庫(成熟版)

你提到的 Druid(數(shù)據(jù)庫連接池)和 HikariCP(連接池),它們本身并不直接提供數(shù)據(jù)源切換功能,但它們是這個方案中不可或缺的“高性能連接池”組件。

真正用于動態(tài)切換數(shù)據(jù)源的明星第三方庫,是 MyBatis-Plus 生態(tài)下的 dynamic-datasource。

維度評價
優(yōu)點開箱即用,功能強大。支持?jǐn)?shù)據(jù)源分組、密碼解密、多主多從、敏感信息加密、集成 Seata 分布式事務(wù)等。只需引入依賴并在 application.yml 中配置,然后直接在方法上使用 @DS("slave1") 注解即可。
缺點引入了一個外部依賴。如果項目沒有使用 MyBatis-Plus,需要額外集成。對于非常簡單的需求,可能顯得有點“重”。

?? 最終選擇指南

你的情況推薦方案
項目簡單,切換點極少(1-2個),且未來不會擴展方案一(硬編碼)即可。
標(biāo)準(zhǔn)企業(yè)級應(yīng)用,使用 Spring Boot + MyBatis方案二(自研 AOP + AbstractRoutingDataSource) 是主流選擇,平衡了靈活性與可控性。
已經(jīng)使用 MyBatis-Plus,或希望最大程度簡化配置方案四(dynamic-datasource 插件) 是最高效的選擇。
有非常復(fù)雜的動態(tài)路由規(guī)則(如根據(jù) userId 哈希取模)方案三(繼承 AbstractRoutingDataSource) 是最靈活、最底層的方式,可以在 determineCurrentLookupKey() 中實現(xiàn)任意邏輯。

對于大多數(shù)項目,方案二(AOP + 注解 + AbstractRoutingDataSource) 和 方案四(MyBatis-Plus 的 dynamic-datasource) 是最值得考慮的。

另外補充一點,無論選擇哪種方案,都要注意:如果在 Spring 事務(wù)(@Transactional)中切換數(shù)據(jù)源,必須在事務(wù)開啟之前進行。因為事務(wù)管理器在開啟時就已經(jīng)確定了要使用的數(shù)據(jù)源,之后的切換將不會生效。如果需要在事務(wù)中切換數(shù)據(jù)源,可以考慮使用 @Transactional(propagation = Propagation.REQUIRES_NEW) 開啟一個新的事務(wù),或?qū)⑶袚Q邏輯放在一個沒有事務(wù)的方法中調(diào)用。

到此這篇關(guān)于Mybatis數(shù)據(jù)源切換的幾種方法小結(jié)的文章就介紹到這了,更多相關(guān)Mybatis數(shù)據(jù)源切換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于Mybatis-plus設(shè)置字段為空的正確寫法

    關(guān)于Mybatis-plus設(shè)置字段為空的正確寫法

    這篇文章主要介紹了關(guān)于Mybatis-plus設(shè)置字段為空的正確寫法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java調(diào)用第三方http接口的常用方式總結(jié)

    Java調(diào)用第三方http接口的常用方式總結(jié)

    這篇文章主要介紹了Java調(diào)用第三方http接口的常用方式總結(jié),具有很好的參考價值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 兩種Eclipse部署動態(tài)web項目方法

    兩種Eclipse部署動態(tài)web項目方法

    這篇文章主要介紹了兩種Eclipse部署動態(tài)web項目方法,需要的朋友可以參考下
    2015-11-11
  • Java實現(xiàn)將對象轉(zhuǎn)換為二進制流再轉(zhuǎn)為Base64字符串

    Java實現(xiàn)將對象轉(zhuǎn)換為二進制流再轉(zhuǎn)為Base64字符串

    這篇文章主要為大家詳細介紹了如何使用Java實現(xiàn)將對象轉(zhuǎn)換為二進制流再轉(zhuǎn)為Base64字符串,本文提供了四種方法,大家可以根據(jù)需要進行選擇
    2025-12-12
  • 使用IDEA反編譯沒有擦除泛型的原因解析

    使用IDEA反編譯沒有擦除泛型的原因解析

    Java泛型引入至今已有近20年,“偽泛型”已被認為是所有開發(fā)者的共識,沒有必要再在反編譯后體現(xiàn)出來反倒大大降低了可讀性,這篇文章主要介紹了使用IDEA反編譯沒有擦除泛型的原因解析,需要的朋友可以參考下
    2023-05-05
  • 淺談Java為什么只能單繼承

    淺談Java為什么只能單繼承

    本文主要介紹了Java為什么只能單繼承,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 基于Java開發(fā)實現(xiàn)ATM系統(tǒng)

    基于Java開發(fā)實現(xiàn)ATM系統(tǒng)

    這篇文章主要為大家詳細介紹了基于Java開發(fā)實現(xiàn)ATM系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • spring的pointcut正則表達式的實現(xiàn)

    spring的pointcut正則表達式的實現(xiàn)

    本文主要介紹了spring的pointcut正則表達式的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • java -jar設(shè)置添加啟動參數(shù)實現(xiàn)方法

    java -jar設(shè)置添加啟動參數(shù)實現(xiàn)方法

    這篇文章主要介紹了java -jar設(shè)置添加啟動參數(shù)實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Spring Boot 指定外部啟動配置文件詳解

    Spring Boot 指定外部啟動配置文件詳解

    在springboot項目中,也可以使用yml類型的配置文件代替properties文件。接下來通過本文給大家分享Springboot配置文件的使用,感興趣的朋友一起看看吧
    2021-09-09

最新評論

岳普湖县| 长春市| 东阳市| 遂溪县| 西林县| 日土县| 濮阳市| 尉氏县| 横峰县| 德保县| 灵宝市| 昆山市| 鄂温| 灯塔市| 土默特右旗| 介休市| 屯门区| 报价| 留坝县| 永城市| 汾西县| 黔江区| 孟津县| 普洱| 兰考县| 平山县| 枝江市| 包头市| 冷水江市| 扬中市| 格尔木市| 沭阳县| 澄迈县| 迭部县| 和平县| 汽车| 达拉特旗| 江油市| 民勤县| 泗水县| 罗甸县|