Spring Boot 3 整合 Mybatis-Plus 實現動態數據源切換實戰

🚀 作者主頁: 有來技術
🔥 開源項目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot
🌺 倉庫主頁: Gitee 💫 Github 💫 GitCode
💖 歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請糾正!

目錄

  • 前言
  • Spring Boot 整合動態數據源
    • Maven 依賴
    • 動態數據源配置
  • 動態切換數據源實戰
    • 注解切換數據源
    • 手動切換數據源
  • 動態數據源原理
  • 結語
  • 開源項目

前言

處理多數據庫場景是一項常見的任務。本文將介紹如何使用 dynamic-datasource-spring-boot-starter 啟動器,以簡化 Spring Boot 項目中的多數據源集成。

Spring Boot 整合動態數據源

參考 dynamic-datasource 官網:https://www.kancloud.cn/tracy5546/dynamic-datasource/2264611

Maven 依賴

pom.xml 添加依賴坐標,Spring Boot 3 區別其他版本,使用的是 dynamic-datasource-spring-boot3-starter , 其他版本的 Spring Boot 使用 dynamic-datasource-spring-boot-starter , 除了依賴區別,其他配置和使用方式新老版本無差別。

  • Spring Boot 3

    <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot3-starter</artifactId><version>4.2.0</version>
    </dependency>
    
  • Spring 1.5.x Spring 2.x.x

    <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>4.2.0</version>
    </dependency>
    

動態數據源配置

spring:datasource:dynamic:primary: master #設置默認的數據源或者數據源組,默認值即為 masterstrict: false # 設置嚴格模式,當數據源找不到時,是否拋出異常,默認為false不拋出datasource:master: # 主庫type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0開始支持SPI可省略此配置url: jdbc:mysql://www.youlai.tech:3306/youlai_boot?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&allowMultiQueries=trueusername: youlaipassword: 123456slave: # 從庫type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/youlai_boot?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&allowMultiQueries=trueusername: rootpassword: 123456

動態切換數據源實戰

注解切換數據源

@DS 可以注解在方法上或類上,同時存在就近原則 方法上注解 優先于 類上注解

注解結果
沒有@DS默認數據源
@DS(“dsName”)dsName可以為組名也可以為具體某個庫的名稱
/*** 主庫查詢*/
@DS("master")
@Select("select * from sys_user where id = #{userId}")
SysUser getUserFromMaster(Long userId);/*** 從庫查詢*/
@DS("slave")
@Select("select * from sys_user where id = #{userId}")
SysUser getUserFromSlave(Long userId);

單元測試類

package com.youlai.system.mapper;import com.youlai.system.model.entity.SysUser;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
@Slf4j
class SysUserMapperTest {@Autowiredprivate SysUserMapper userMapper;private final Long userId = 1L;/*** 測試注解方式切換數據源*/@Testvoid testSwitchDataSourceByAnnotation() {SysUser masterUser = userMapper.getUserFromMaster(userId);log.info("用戶ID:{} 主庫姓名:{}", userId, masterUser.getNickname());SysUser slaveUser = userMapper.getUserFromSlave(userId);log.info("用戶ID:{} 從庫姓名:{}", userId, slaveUser.getNickname());}
}

測試結果

手動切換數據源

有些場景沒法使用注解去切換,舉個例子,同一個方法內使用 Mybatis-Plus 提供的方法先后分別從主庫和從庫各查一次。

這時候簡單的切換數據源就是使用 DynamicDataSourceContextHolder 的 push 方法動態設置數據源上下文,完成了使用特定數據源的數據庫操作后,再調用 poll 方法,以便將數據源上下文清空,避免影響后續的數據庫操作。

    /*** 測試手動方式切換數據源*/@Testvoid testDataSourceSwitchManually() {DynamicDataSourceContextHolder.push("master");SysUser masterUser = userMapper.selectById(userId);log.info("手動切換:主庫姓名:{}", masterUser.getNickname());DynamicDataSourceContextHolder.poll();DynamicDataSourceContextHolder.push("slave");SysUser slaveUser = userMapper.selectById(userId);log.info("手動切換:從庫姓名:{}",  slaveUser.getNickname());DynamicDataSourceContextHolder.poll();}

測試結果

動態數據源原理

源碼圖如下,原理會在下一篇【原理篇】詳細講解。
在這里插入圖片描述

結語

通過 dynamic-datasource-spring-boot-starter 這個啟動器,我們輕松實現了在 Spring Boot 項目中集成多數據源的功能。無論是注解方式還是手動方式切換數據源,都使得處理多數據庫場景變得更加簡便和靈活。

在注解方式中,通過 @DS 注解,我們可以輕松切換數據源,實現了一定的自動化。而在手動方式中,使用 DynamicDataSourceContextHolderpushpoll 方法,我們可以更加靈活地控制數據源的切換,適用于一些特殊場景。

在下一篇文章中,我們將深入探討 dynamic-datasource 的原理,了解其如何實現動態數據源切換,同時也會對 MyBatis 的源碼進行一些了解。這將有助于更好地理解多數據源切換的底層機制。

開源項目

  • SpringCloud + Vue3 微服務商城
GithubGitee
后端youlai-mall 🍃youlai-mall 🍃
前端mall-admin🌺mall-admin 🌺
移動端mall-app 🍌mall-app 🍌
  • SpringBoot 3+ Vue3 單體權限管理系統
GithubGitee
后端youlai-boot 🍃youlai-boot 🍃
前端vue3-element-admin 🌺vue3-element-admin 🌺

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

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

相關文章

1-5、JDK API文檔

語雀原文鏈接 文章目錄 jdk1.8中文.CHM JDK8中文在線文檔&#xff1a;https://www.matools.com/api/java8Java11中文在線文檔&#xff1a;https://www.matools.com/api/java11

CEEMDAN-Transformer時間序列預測實戰完整代碼數據可直接運行

項目視頻講解: CEEMDAN-Transformer時間序列預測實戰完整代碼數據_嗶哩嗶哩_bilibili 完整代碼: import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.preprocessing import MinMaxScaler import torch import to…

ROS-log功能區別

ROS使用rosout包來記錄各個節點的log信息&#xff0c;通常這些log信息是一些可以讀懂的字符串信息&#xff0c;這些信息一般用來記錄節點的運行狀態。 ROS有五種不同類型的log信息&#xff0c;分別為&#xff1a;logdebug、loginfo、logwarn、logerr、logfatal。 等級由低到高&…

GO設計模式——6、原型模式(創建型)

目錄 原型模式&#xff08;Prototype Pattern&#xff09; 優缺點 使用場景 注意事項 代碼實現 原型模式&#xff08;Prototype Pattern&#xff09; 原型模式&#xff08;Prototype Pattern&#xff09;是用于創建重復的對象&#xff0c;同時又能保證性能。這種類型的設計…

m_map導入本地地形數據

m_map繪制地形圖時&#xff0c;雖然自帶有1的地形圖以及從NOAA下載的1分的地形圖&#xff08;詳見&#xff1a;Matlab下地形圖繪圖包m_map安裝與使用&#xff09;&#xff0c;但有時需要對地形圖分辨率的要求更高&#xff0c;便無法滿足。 此時&#xff0c;需要導入本地地形數…

算法Day22 星南二樓(最長升序子序列)

星南二樓&#xff08;最長升序子序列&#xff09; Description Input Output Sample 代碼 import java.util.*;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int[] grid new int[n];for(int j0;j&l…

selenium火狐避免被檢測向ChartGPT的有效提問

問題描述 當我們問 ChartGPT 如果解決 selenium 被屏蔽問題的時候&#xff0c;它總是回答解決問題的方向&#xff0c;沒有給出具體怎么用代碼實現。 問題原因 1、可能是描述不清晰 沒有告訴GPT使用什么編程語言&#xff0c;沒有說明使用火狐還是谷歌瀏覽器&#xff0c;沒有…

深入解析NK模型:復雜適應性系統的演化之謎

NK模型是一種用于研究復雜適應性系統的數學模型&#xff0c;最初由生物學家 Stuart Kauffman 于1993年提出。這模型的目的是模擬生物進化過程中的復雜性&#xff0c;并通過網絡結構和相互作用來研究解空間的性質。 目錄 一、NK模型介紹1. 模型基礎2. 模型參數3. 適應性函數4..…

ubuntu里安裝docker

1、更新軟件包 在終端中執行以下命令來更新Ubuntu軟件包列表和已安裝軟件的版本: sudo apt update sudo apt upgrade 2、安裝docker依賴 Docker在Ubuntu上依賴一些軟件包。執行以下命令來安裝這些依賴: apt-get install ca-certificates curl gnupg lsb-release 3、添加Do…

postman接口自動化測試

Postman除了前面介紹的一些功能&#xff0c;還有其他一些小功能在日常接口測試或許用得上。今天&#xff0c;我們就來盤點一下&#xff0c;如下所示&#xff1a; 1.數據驅動 ? ? 想要批量執行接口用例&#xff0c;我們一般會將對應的接口用例放在同一個Collection中&#xf…

unity 2d 入門 飛翔小鳥 Cinemachine 鏡頭跟隨小鳥 多邊形碰撞器 解決鏡頭不會穿模問題(十二)

1、安裝 window->package manager 2、創建Cinemachine 右鍵->Cinemachine->2D Carmera 3、創建空對象和多邊形控制器如圖 記得勾選 is Trigger 空對象位置記得要和小鳥保持一致&#xff0c;不然等下寫完腳本后&#xff0c;鏡頭一開始會移動一下 4、將多邊形觸…

代碼隨想錄算法訓練營第四十天|139.單詞拆分,多重背包,背包問題

139. 單詞拆分 - 力扣&#xff08;LeetCode&#xff09; 給你一個字符串 s 和一個字符串列表 wordDict 作為字典。請你判斷是否可以利用字典中出現的單詞拼接出 s 。 注意&#xff1a;不要求字典中出現的單詞全部都使用&#xff0c;并且字典中的單詞可以重復使用。 示例 1&a…

【Delphi】FMX開發 ios 和 android 異同點(踩坑記)

目錄 一、前言 二、補充下基礎知識 1. APP程序事件&#xff1a;TApplicationEvent 2. APP內置Web服務器或者UDP服務端或者TCP服務端 三、iOS 和 android 平臺的不同點 1. TApplicationEvent的不同點&#xff1a;以下不同點&#xff0c;請仔細閱讀&#xff01; 2. APP內置…

AI 繪畫 | Stable Diffusion 人物換臉

前言 這篇文章教會你如何使用Stable Diffusion WEB UI擴展插件ReActor輕松實現圖片中的人物換臉。ReActor 是 Stable Diffusion WebUI 的擴展,它允許在圖像中非常簡單準確地進行人臉替換(人臉交換)。 安裝環境準備 安裝 Visual Studio 2022(例如,社區版本 - 需要此步驟來…

十八、FreeRTOS之FreeRTOS任務通知

本節需要掌握以下內容&#xff1a; 1、任務通知的簡介&#xff08;了解&#xff09; 2、任務通知值和通知狀態&#xff08;熟悉&#xff09; 3、任務通知相關API函數介紹&#xff08;熟悉&#xff09; 4、任務通知模擬信號量實驗&#xff08;掌握&#xff09; 5、任務通知…

智能無人零售:革新零售消費體驗的未來

智能無人零售&#xff1a;革新零售消費體驗的未來 在當今數字化時代&#xff0c;智能無人零售正以驚人的速度改變著我們的購物方式和消費體驗。這一新興領域的發展&#xff0c;為消費者帶來了前所未有的便利和個性化選擇。 智能無人零售是指利用先進的智能技術和自動化系統&…

【面試題:對象引用在內存中存在何處?基于何種計算機原理獲取對象的值?】

嗨&#xff0c;小伙伴們&#xff01;小米在這里啦&#xff0c;今天給大家分享一個超有趣的話題——面試題&#xff1a;對象引用是存在內存哪&#xff0c;基于什么計算機原理獲取對象的值&#xff1f;廢話不多說&#xff0c;讓我們一起深入了解一下這個充滿技術魅力的問題吧&…

Java 安全框架shiro初探之一

1.Java安全框架除了spring家族另一個就是shiro框架 不過最近還有一個國產框架很好用&#xff1a;Sa-Token 添加鏈接描述&#xff0c;想了解的小伙伴可以去look look shiro 官方文檔 (https://shiro.apache.org/) 1. 學習教程 參考 (https://www.w3cschool.cn/shiro/) Apac…

2024濟南大健康展會,第六屆中國國際健康產業博覽會5月舉辦

大力發展全國健康事業 助力健康中國行動戰略 DJK 2024第6屆中國&#xff08;濟南&#xff09;國際大健康產業博覽會 The 2024 sixth China (Jinan) International Big Health Industry Expo 時間&#xff1a;2024年05月27日—29日 場館&#xff1a;中國濟南黃河國際會展中心 …

java中實現線程池的方式有哪些?

在 Java 中&#xff0c;實現線程池的方式主要有兩種&#xff1a; ThreadPoolExecutor 類&#xff1a; ThreadPoolExecutor 是 Java 提供的靈活、強大的線程池實現類。通過創建 ThreadPoolExecutor 對象&#xff0c;可以自定義線程池的各種參數&#xff0c;包括核心線程數、最大…