MyBatis如何實現動態數據源切換?

大家好,我是鋒哥。今天分享關于【MyBatis如何實現動態數據源切換?】面試題。希望對大家有幫助;

MyBatis如何實現動態數據源切換?

超硬核AI學習資料,現在永久免費了!

在MyBatis中實現動態數據源切換,通常需要依賴Spring的動態數據源管理機制,結合一些自定義的切換策略。以下是實現動態數據源切換的基本步驟:

1.?配置數據源

首先,在配置文件中配置多個數據源。例如,配置兩個數據源:masterDataSourceslaveDataSource

<bean id="masterDataSource" class="org.apache.commons.dbcp2.BasicDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/master_db"/><property name="username" value="root"/><property name="password" value="root"/>
</bean><bean id="slaveDataSource" class="org.apache.commons.dbcp2.BasicDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/slave_db"/><property name="username" value="root"/><property name="password" value="root"/>
</bean>

2.?定義動態數據源

創建一個自定義的數據源類,它能夠切換不同的數據源。AbstractRoutingDataSource 是Spring提供的一個抽象類,適用于實現動態數據源。

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {// 返回當前的數據源標識(如:master 或 slave)return DataSourceContextHolder.getDataSourceType();}
}

3.?數據源上下文管理

為了管理當前使用的數據源,可以創建一個 DataSourceContextHolder 類,用來存儲和獲取當前線程的數據源標識。

public class DataSourceContextHolder {private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();public static void setDataSourceType(String dataSourceType) {contextHolder.set(dataSourceType);}public static String getDataSourceType() {return contextHolder.get();}public static void clearDataSourceType() {contextHolder.remove();}
}

4.?配置動態數據源

在Spring配置中使用 DynamicDataSource 替代傳統的單一數據源。

<bean id="dataSource" class="com.example.DynamicDataSource"><property name="defaultTargetDataSource" ref="masterDataSource"/><property name="targetDataSources"><map><entry key="master" value-ref="masterDataSource"/><entry key="slave" value-ref="slaveDataSource"/></map></property>
</bean>

5.?AOP實現數據源切換

使用Spring AOP(面向切面編程)來切換數據源。可以通過注解或者在方法執行前動態修改當前線程的 DataSource

例如,創建一個注解 @DataSource 來標記需要切換數據源的方法:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface DataSource {String value() default "master"; // 默認使用master數據源
}

然后,創建一個切面(Aspect),根據注解切換數據源:

@Aspect
@Component
public class DataSourceAspect {@Before("@annotation(dataSource)")public void changeDataSource(DataSource dataSource) {// 切換數據源DataSourceContextHolder.setDataSourceType(dataSource.value());}@After("@annotation(dataSource)")public void restoreDataSource(DataSource dataSource) {// 切換回默認數據源DataSourceContextHolder.clearDataSourceType();}
}

6.?在服務層使用注解切換數據源

在需要切換數據源的方法上使用 @DataSource 注解:

@Service
public class UserService {@DataSource("master")  // 使用master數據源public void addUser(User user) {// 執行數據庫操作}@DataSource("slave")  // 使用slave數據源public List<User> getUsers() {// 執行數據庫查詢return userRepository.findAll();}
}

7.?使用完畢后清理數據源

在每次請求結束后,確保清理 ThreadLocal 中存儲的數據源標識,避免線程池復用時出現錯誤。

public class DataSourceContextHolder {private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();public static void setDataSourceType(String dataSourceType) {contextHolder.set(dataSourceType);}public static String getDataSourceType() {return contextHolder.get();}public static void clearDataSourceType() {contextHolder.remove();}
}

總結:

  • 數據源管理:使用?DynamicDataSource?來管理多個數據源。
  • 數據源切換:通過?DataSourceContextHolder?類和Spring AOP機制,在方法執行時切換數據源。
  • 使用場景:動態切換數據源通常用于讀寫分離,或者多數據庫操作的場景。

這樣,你就可以在 MyBatis 中根據需要動態地切換數據源了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/913265.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/913265.shtml
英文地址,請注明出處:http://en.pswp.cn/news/913265.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

實踐篇:14-構建 Node.js 應用程序鏡像

背景介紹 Node.js是一個基于 Chrome V8 引擎的 JavaScript 運行時環境&#xff0c;以其事件驅動、非阻塞 I/O 模型而聞名&#xff0c;廣泛用于構建后端服務和前端應用。 Node.js 的特點使其非常適合容器化部署&#xff1a; 輕量級運行時&#xff1a;相比傳統后端語言&#xf…

Spring Cloud 微服務(鏈路追蹤與日志聚合)

&#x1f4cc; 摘要 在微服務架構中&#xff0c;隨著服務數量的增加和調用關系的復雜化&#xff0c;傳統的日志記錄方式已經無法滿足對系統運行狀態的全面掌控。如何快速定位異常請求、分析服務調用耗時、追蹤完整鏈路成為運維和開發人員面臨的核心挑戰。 為此&#xff0c;Sp…

PADS交互式布局

PADS的交互式布局通過原理圖與PCB的雙向聯動大幅提升設計效率。在原理圖中框選電路模塊時&#xff0c;PCB視圖將自動高亮對應元件組并生成可移動簇&#xff0c;拖動時保持模塊內部相對位置不變。布局過程中啟用實時推擠功能&#xff08;Placement Shoving&#xff09;&#xff…

類圖+案例+代碼詳解:軟件設計模式----原型模式

5、原型模式 通過復制現有對象來創建新對象&#xff0c;避免從零開始構建&#xff0c;就像 “復印文件” 一樣。 克隆的核心是復用現有對象狀態 用 克隆熊貓 舉例&#xff0c;秒懂原理 假設你有一只熊貓對象&#xff08;屬性&#xff1a;名字、年齡、毛色&#xff09;&#…

Python-FAQ-__name__、__main__

1 需求 2 接口 3 示例 4 參考資料 在 Python 中&#xff0c;像 __name__ 這樣的雙下劃線屬性&#xff08;也稱為 "dunder" 屬性&#xff0c;即 "double underscore" 的縮寫&#xff09;是 Python 的特殊屬性或方法&#xff0c;它們為類、對象或模塊提供了…

Adobe高階技巧與設計師創意思維的進階指南

作為一名在全球設計圈摸爬滾打了十年的職業設計師&#xff0c;我深知創意與技術的結合是點燃靈感的火花。憑借英國Parvis School of Economics and Music大學提供的Adobe正版教育訂閱&#xff0c;我得以在設計之路上不斷探索與突破。今天&#xff0c;我想以輕松實用的口吻&…

音視頻會議服務搭建(設計方案-Go服務端API業務邏輯流程圖)-04

前言 這一篇是 關于 Go服務端相關的音視頻會議的接口API業務邏輯流程圖肯定是不能完全復用到你的項目中去的&#xff0c;但是希望對你有一些參考性的幫助嗯&#xff0c;我也是在不斷的進行完善和優化&#xff0c;并不是最終的結構&#xff0c;先定好大方向&#xff0c;然后不斷…

C++ Qt Widget繪圖畫布縮放與平移:實現CAD級交互體驗

在圖形應用程序開發中&#xff0c;實現流暢的縮放和平移功能是創建專業級繪圖工具的基礎。本文將深入探討如何在Qt Widget中實現CAD級別的交互體驗&#xff0c;包括視圖變換、坐標系統管理以及交互功能實現。核心概念&#xff1a;視圖變換與坐標系統 在圖形應用中&#xff0c;我…

Paimon 位圖索引解析:高效等值查詢的秘密( Bit-Sliced Index)

BitmapFileIndexBitmapFileIndex 這個類 是 Paimon 中一個非常重要的索引類型&#xff0c;它使用位圖&#xff08;Bitmap&#xff09;來精確定位數據&#xff0c;尤其擅長處理低基數&#xff08;low-cardinality&#xff09;列的等值查詢。BitmapFileIndex 實現了 FileIndexer …

S7-1200 CPU 與 S7-200 CPU S7通信(S7-1200 作為服務器

7-1200 CPU 與 S7-200 CPU S7通信&#xff08;S7-1200 作為服務器&#xff09; S7-1200 CPU 與 S7-200 CPU 之間的通信只能通過 S7 通信來實現&#xff0c;因為 S7-200 的以太網模塊只支持S7 通信。當S7-200作為客戶端&#xff0c;S7-1200作為服務器&#xff0c;需在客戶端單邊…

pyspark大規模數據加解密優化實踐

假如有1億行數據 方法1 spark udf解密 from pyspark.sql import SparkSession import pyspark.sql.functions as F from pyDes import * import binasciisparkSparkSession.builder.getOrCreate()def dec_fun(text):key triple_des(b"HHHHHHHHHHHHHHHHHHHHHHHH", CB…

華為云Flexus+DeepSeek征文|華為云ECS與CCE:從介紹到架構部署·僅需要此文足矣

前引&#xff1a;當今的企業面臨著前所未有的技術挑戰&#xff1a;如何構建既安全又高效、既靈活又可靠的云服務架構&#xff1f;如何有效整合人工智能技術&#xff0c;打造智能化的運維和服務體系&#xff1f;這些問題的答案&#xff0c;正在悄然改變著企業級IT基礎設施的生態…

DAY 50 預訓練模型+CBAM模塊

浙大疏錦行https://blog.csdn.net/weixin_45655710 知識點回顧&#xff1a; resnet結構解析CBAM放置位置的思考針對預訓練模型的訓練策略 差異化學習率三階段微調 作業&#xff1a; 好好理解下resnet18的模型結構嘗試對vgg16cbam進行微調策略 ResNet-18 結構核心思想 可以將R…

docker連接mysql

查看在運行的容器&#xff1a;docker ps -s 進入容器&#xff1a;docker exec -it 容器號或名 /bin/bash&#xff0c;如&#xff1a;docker exec -it c04c438ff177 /bin/bash 或docker exec -it mysql /bin/bash。 3. 登錄mysql&#xff1a;mysql -uroot -p123456

javaweb第182節Linux概述~ 虛擬機連接不上FinalShell

問題描述 虛擬機無法連接到finalshell 報錯 session.connect:java.net.socketexception:connection reset 或者 connection is closed by foreign host 解決 我經過一系列的排查&#xff0c;花費了一天的時間后&#xff0c;發現&#xff0c;只是因為&#xff0c;我將連接…

高壓電纜護層安全的智能防線:TLKS-PLGD 監控設備深度解析

在現代電力系統龐大復雜的網絡中&#xff0c;高壓電纜護層是守護電力傳輸的 "隱形鎧甲"&#xff0c;其安全直接影響電網穩定。傳統監測手段響應慢、精度低&#xff0c;難以滿足安全運維需求。TLKS-PLGD 高壓電纜護層環流監控設備應運而生&#xff0c;提供智能化解決方…

Element-Plus Cascader 級聯選擇器獲取節點名稱和value值方法

html 部分 <template><el-cascaderref"selectAeraRef":options"areas":disabled"disabled":props"optionProps"v-model"selectedOptions"filterablechange"handleChange"><template #default"…

STM32中實現shell控制臺(命令解析實現)

文章目錄一、核心設計思想二、命令系統實現詳解&#xff08;含完整注釋&#xff09;1. 示例命令函數實現2. 初始化命令系統3. 命令注冊函數4. 命令查找函數5. 命令執行函數三、命令結構體&#xff08;cmd\_t&#xff09;四、運行效果示例五、小結在嵌入式系統的命令行控制臺&am…

基于matlab的二連桿機械臂PD控制的仿真

基于matlab的二連桿機械臂PD控制的仿真。。。 chap3_5input.m , 1206 d2plant1.m , 1364 hs_err_pid2808.log , 15398 hs_err_pid4008.log , 15494 lx_plot.m , 885 PD_Control.mdl , 35066 tiaojie.m , 737 chap2_1ctrl.asv , 988 chap2_1ctrl.m , 905

TCP、HTTP/1.1 和HTTP/2 協議

TCP、HTTP/1.1 和 HTTP/2 是互聯網通信中的核心協議&#xff0c;它們在網絡分層中處于不同層級&#xff0c;各有特點且逐步演進。以下是它們的詳細對比和關鍵特性&#xff1a;1. TCP&#xff08;傳輸控制協議&#xff09; 層級&#xff1a;傳輸層&#xff08;OSI第4層&#xff…