springboot結合baomidou dynamic-datasource組件實現多數據源

dynamic-datasource組件實現多數據源

  • 一、背景介紹
  • 二、 思路方案
  • 三、過程
  • 四、總結
  • 五、升華

一、背景介紹

博主最近研發的項目中由于業務需要,在項目中使用到多個數據源。使用到了baomidou的dynamic-datasource組件來實現訪問不同的數據源。覺得挺有意思的也是進行了入門級別的研究,梳理出了dynamic-datasource組件宏觀實現邏輯。

二、 思路方案

在沒有框架之前我們訪問數據庫是創建數據庫連接然后執行操作數據庫的命令。那么如果要用到多個數據源的話就需要創建數據庫A連接和數據庫B連接,再分別用數據庫A的連接和數據庫B的連接訪問數據庫就行了。
其實baomidou 的dynamic-datasource組件實現多數據源也是差不多同一個道理。

三、過程

baomidou dynamic-datasource官方文檔

  1. 引入dynamic-datasource-spring-boot-starter。
    在這里插入圖片描述
<!--動態數據庫切換--><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>4.1.3</version></dependency>
  1. 配置數據源。
spring:datasource:dynamic: #動態primary: master #設置默認的數據源或者數據源組,默認值即為masterstrict: false #嚴格匹配數據源,默認false. true未匹配到指定數據源時拋異常,false使用默認數據源datasource:master:url: jdbc:mysql://xxxxx:3306/xxx?useUnicode=true&characterEncoding=utf8username: xxxxpassword: xxxxdriver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0開始支持SPI可省略此配置slave_1:url: jdbc:mysql://xxxx:3306/xxxx?useUnicode=true&characterEncoding=utf8username: xxxpassword: xxxdriver-class-name: com.mysql.jdbc.Driver
  1. 使用 @DS 切換數據源。
    在這里插入圖片描述
package com.wangwei.easycodemybatisplus.dao;import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wangwei.easycodemybatisplus.entity.Actor;/*** (Actor)表數據庫訪問層** @author wangwei* @since 2024-05-21 10:34:39*/
@DS("slave_1")
public interface ActorDao extends BaseMapper<Actor> {}
package com.wangwei.easycodemybatisplus.dao;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wangwei.easycodemybatisplus.entity.ArproUserCourseInfo;/*** 用戶課程列表(ArproUserCourseInfo)表數據庫訪問層** @author wangwei* @since 2024-05-21 09:39:06*/
public interface ArproUserCourseInfoDao extends BaseMapper<ArproUserCourseInfo> {}

當我們使用對應的Dao層接口的時候,會進行數據源的切換。

  1. 原理解析
    5.在這里插入圖片描述

dynamic-datasource組件中有DynamicRoutingDataSource 類繼承自 Spring 的 AbstractRoutingDataSource,里面封裝了dataSourceMap屬性——dataSourceMap(concurrentHashMap)用戶存儲所有的數據庫映射關系,鍵為數據源名稱,值為DataSource對象(里面包含了數據庫的url,賬號,密碼等信息)。并且也封裝了操作數據源的方法。
@DS 注解:在 DAO 層或服務層的方法或類上使用 @DS 注解來指定使用哪個數據源,當一個數據源被指定使用(通過 @DS 注解),并且有數據庫操作請求時,DynamicRoutingDataSource 會從dataSourceMap 中獲取對應的 DataSource 對象,并創建數據庫連接。

四、總結

  1. baomidou實現多數據源的切換在使用過程中還需要注意事務的問題。
  2. 明白了多數據源的底層之后,也可以自己實現多數據源切換。另外多數據源方案還有Sharding-JDBC 和Spring Data JPA多數據源方案。

五、升華

  1. 通過這次對多數據源的原理的研究發現其實挺有意思的,并且于很早之前的沒有框架的時候實現數據庫連接串聯了起來,這樣這塊知識會比較影響深刻。

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

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

相關文章

Redis事務(1)

什么是事務&#xff1f; Redis 的事務和 MySQL 的事務概念上是類似的. 都是把?系列操作綁定成?組. 讓這?組能夠批量執行。 但是注意體會 Redis 的事務和 MySQL 事務的區別: 弱化的原?性: redis 沒有 “回滾機制”. 只能做到這些操作 “批量執?”. 不能做到 “?個失敗就…

海外鏈游地鐵跑酷全自動搬磚掛機掘金變現項目,號稱單窗口一天收益30+(教程+工具)

一、項目概述 地鐵跑酷海外版國外版自動搬磚掛機掘金項目是一款結合了地鐵跑酷元素的在線游戲&#xff0c;為玩家提供一個全新的游戲體驗&#xff0c;使得玩家可以輕松地進行游戲&#xff0c;無需手動操作&#xff0c;節省時間和精力。 二、游戲特點 1. 自動化操作&#xff1…

AI應用案例:影像報告智能輔助編輯系統

今天給大家介紹一個醫療行業的案例“影像報告智能輔助編輯系統”&#xff01;該案例已經在某三甲醫院落地&#xff0c;模型準確度超過80%。 該項目上線后&#xff0c;保守估計&#xff0c;能為每位醫生的每一張報告至少省下1分鐘時間和2分鐘的精力&#xff0c;20位初級醫生&…

Django Web:搭建Websocket服務器(入門篇)

Django Web架構 搭建Websocket服務器&#xff08;1&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:htt…

如何在Windows 10上對硬盤進行碎片整理?這里提供步驟

隨著時間的推移&#xff0c;由于文件系統中的碎片&#xff0c;硬盤驅動器可能會開始以較低的效率運行。為了加快驅動器的速度&#xff0c;你可以使用內置工具在Windows 10中對其進行碎片整理和優化。方法如下。 什么是碎片整理 隨著時間的推移&#xff0c;組成文件的數據塊&a…

Incremental Task and Motion Planning: A Constraint-Based Approach(翻譯)

摘要——我們提出了一種新的任務和運動算法規劃&#xff08;TMP&#xff09;&#xff0c;并討論獲得TMP的健壯解決方案所必需的需求和抽象。我們的迭代深化任務和運動規劃&#xff08;IDTMP&#xff09;與類似的、最先進的、概率完全的規劃器相比&#xff0c;該方法是概率完全的…

LeetCode熱題100——矩陣

73.矩陣清零 題目 給定一個 *m* x *n* 的矩陣&#xff0c;如果一個元素為 0 &#xff0c;則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 示例 1&#xff1a; 輸入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 輸出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 示例…

【Linux】端口映射

外部訪問http://127.0.0.1&#xff08;默認端口80&#xff09; 實際訪問http://127.0.0.1:8080 //添加規則 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 //移除規則 iptables -t nat -L -nv --line-numbers iptables -t nat -D PREROUT…

HTML+CSS 玻璃按鈕

效果演示 Code <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>玻璃按鈕</title><li…

期權課程之第二節【買方和賣方的誤區和區別】

期權和股票不一樣&#xff0c;我們玩股票大部分情況我們只會做買方&#xff0c; 看漲多買點&#xff0c;看跌了減倉&#xff0c;或者直接離場&#xff0c;就算不看好的公司&#xff0c;一般也不會嘗試賣空股票的操作&#xff0c;但是期權不一樣&#xff0c;我們不僅能做買方還可…

設計模式 17 組合模式 Composite Pattern

設計模式 17 組合模式 Composite Pattern 1.定義 組合模式&#xff08;Composite Pattern&#xff09;&#xff0c;又叫部分整體模式&#xff0c;是用于把一組相似的對象當作一個單一的對象。組合模式依據樹形結構來組合對象&#xff0c;用來表示部分以及整體層次。這種類型的設…

window好用的網速工具

這是一個用于顯示當前網速、CPU及內存利用率的桌面懸浮窗軟件&#xff0c;并支持任務欄顯示&#xff0c;支持更換皮膚。 github鏈接如下 https://github.com/zhongyang219/TrafficMonitor?tabreadme-ov-file

無人機飛手:ASFC無人機和航模愛好者證書詳解

ASFC無人機和航模愛好者證書是由中國航空運動協會&#xff08;ASFC&#xff09;頒發的一種無人機操作資格認證。這種證書在無人機和航模愛好者群體中享有廣泛的認可度&#xff0c;并被視為操作無人機的一種重要資質。 ASFC證書的定義和用途十分明確。它是民航局頒發的民用無人駕…

springboot3微服務下結合springsecurity的認證授權實現

1. 簡介 在微服務架構中&#xff0c;系統被拆分成許多小型、獨立的服務&#xff0c;每個服務負責一個功能模塊。這種架構風格帶來了一系列的優勢&#xff0c;如服務的獨立性、彈性、可伸縮性等。然而&#xff0c;它也帶來了一些挑戰&#xff0c;特別是在安全性方面。這時候就體…

【前端筆記】Vue項目報錯Error: Cannot find module ‘webpack/lib/RuleSet‘

網上搜了下發現原因不止一種&#xff0c;這里僅記錄本人遇到的原因和解決辦法&#xff0c;僅供參考 原因&#xff1a;因為某種原因導致本地package.json中vue/cli與全局vue/cli版本不同導致沖突。再次提示&#xff0c;這是本人遇到的&#xff0c;可能和大家有所不同&#xff0c…

一張圖片中有多個一樣的目標物體,分別進行識別定位分割(Python實現)

需求&#xff1a; 一張圖片中有多個目標物體&#xff0c;將多個目標物體進行識別分割定位 import cv2 import numpy as npdef show_photo(name,picture):cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()img_path r"test3.png" img cv2.imread(img…

關于微信小程序低功耗藍牙ECharts實時刷新

最近搞了這方面的東西&#xff0c;是剛剛開始接觸微信小程序&#xff0c;因為是剛剛開始接觸藍牙設備&#xff0c;所以這篇文章適合既不熟悉小程序&#xff0c;又不熟悉藍牙的新手看。 項目要求是獲取到藍牙傳輸過來的數據&#xff0c;并顯示成圖表實時顯示&#xff1b; 我看了…

轉運機器人負載最高可達 1000kg,重復精度高達±5mm

轉運機器人&#xff0c;內部搭載ICD系列核心控制器&#xff0c;擁有不同的移載平臺&#xff0c;負載最高可達 1000kg;重復精度高達5mm;支持 Wi-Fi漫游&#xff0c;實現更穩健的網絡數據交互;無軌化激光 SLAM 導航&#xff0c;配合 3D 避障相機等多傳感器進行安全防護。轉運器人…

java中使用jedis連接redis

4.java中使用jedis連接redis

P1-機器學習的核心算法-九五小龐

核心算法 線性回歸算法 線性回歸是一種預測數值型數據的監督學習算法。它的基本思想是通過學習一個線性模型&#xff0c;使得模型能夠盡可能準確地預測實值輸出標記。在單變量線性回歸中&#xff0c;我們有一個特征&#xff08;或輸入變量&#xff09;和一個目標變量&#xf…