Spring Boot 雙數據源配置

文章目錄

    • 什么是雙數據源?
    • 為什么需要雙數據源?
    • 核心實現原理
    • 完整示例
    • 注意

什么是雙數據源?

雙數據源是指在一個應用程序中同時配置和使用兩個不同的數據庫連接。比如:

  • 一個連接訂單數據庫,處理業務數據
  • 一個連接用戶中心數據庫,處理用戶信息

這樣的架構設計可以實現數據隔離、業務分離,提升系統的可維護性和擴展性。

實現原理基于 AbstractRoutingDataSource 動態切換。

為什么需要雙數據源?

1. 業務分離
不同的業務模塊使用獨立的數據庫,職責更加明確:

訂單系統 → 訂單數據庫(存儲訂單、商品、支付信息)
用戶系統 → 用戶數據庫(存儲用戶、權限、組織信息)

2. 性能優化

  • 分散數據庫負載,避免單點壓力
  • 可以針對不同業務特點優化數據庫配置

3. 數據安全

  • 敏感數據隔離存儲
  • 不同數據源可以設置不同的訪問權限

核心實現原理

雙數據源的核心是 Spring 的 AbstractRoutingDataSource(用于動態切換數據源),它可以根據某個鍵值動態選擇不同的數據源:

Spring 每次訪問數據庫前,都會先執行 determineCurrentLookupKey方法 來判斷用哪個數據源。我們通過 AOP 切面,在執行方法前設置好對應的數據源,就能實現動態切換。

配置好雙數據源后,訪問另一個數據庫的方式和訪問本地數據庫幾乎一樣,開發時感知不到差異。

public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {// 返回當前線程需要使用的數據源標識return DataSourceContextHolder.getDataSourceType();}
}

完整示例

https://github.com/yikousu/DataSwitch

注意

普通的 @Transactional 注解無法跨數據源生效!

解決方案:

  • 推薦:同一業務盡量只操作一個數據源

  • 如必須跨庫:考慮使用分布式事務框架

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

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

相關文章

【Java】【力扣】102.二叉樹層序遍歷

思路一個輔助隊列&#xff08;初始化隊列&#xff1a;根節點入隊&#xff09;一個節點 出隊&#xff0c;他的左右孩子入隊循環 直到隊列為空舉例代碼public List<List<Integer>> levelOrder(TreeNode root) {if (rootnull){return new ArrayList<List<Intege…

為什么有些PDF無法復制文字?原理分析與解決方案

在日常辦公和學習中&#xff0c;我們經常會從PDF文件中復制文字&#xff0c;用于編輯、引用、整理筆記。但你是否也遇到過這樣的情況&#xff1a;有些PDF中的文字根本無法選中&#xff0c;更無法復制粘貼&#xff1f; 看起來像是“文字”&#xff0c;但操作上卻完全無效——這…

LabVIEW瀏覽器ActiveX事件交互

?程序圍繞 WebBrowser ActiveX 控件&#xff0c;借 “Reg Event Callback” 注冊標題變更回調&#xff0c;“Callback - Title Change.vi” 處理標題數據&#xff0c;“Monitor...” 響應 URL 變更&#xff0c;“Unregister...” 清理資源&#xff0c;實現瀏覽器事件交互與管控…

C++后端面試八股文

一、C 語言基礎與底層原理請解釋 new / delete 和 malloc / free 的區別和聯系&#xff0c;以及使用它們時需要注意什么new 和 delete 是C的??運算符&#xff08;Operator&#xff09;??。這意味著它們可以被類&#xff08;通過 operator new 和 operator delete&#xff0…

基礎分類模型及回歸簡介(一)

一、先搞懂兩個核心任務&#xff1a;分類和回歸咱們生活中總遇到要 “判斷” 或 “預測” 的事&#xff1a;比如看到一個水果&#xff0c;判斷是蘋果還是橘子 —— 這就是分類&#xff08;結果是 “類別”&#xff09;&#xff1b;比如根據西瓜的大小、顏色&#xff0c;猜它能賣…

【LeetCode 熱題 100】114. 二叉樹展開為鏈表——(解法二)分治

Problem: 114. 二叉樹展開為鏈表 給你二叉樹的根結點 root &#xff0c;請你將它展開為一個單鏈表&#xff1a; 展開后的單鏈表應該同樣使用 TreeNode &#xff0c;其中 right 子指針指向鏈表中下一個結點&#xff0c;而左子指針始終為 null 。 展開后的單鏈表應該與二叉樹 先序…

【WPF】WPF 自定義控件 實戰詳解,含命令實現

&#x1f9e9;《WPF 自定義控件》實戰詳解本文將圍繞如何編寫一個自定義控件&#xff08;如帶右鍵菜單的圖片控件 ImageView&#xff09;&#xff0c;逐步講解其定義、命令綁定與 ContextMenu 中常見的語法技巧。&#x1f9f1; 一、創建一個 WPF 自定義控件的步驟 WPF 中自定義…

Flink 2.0 DataStream算子全景

在實時流處理中&#xff0c;Apache Flink的DataStream API算子是構建流處理 pipeline 的基礎單元。本文基于Flink 2.0&#xff0c;聚焦算子的核心概念、分類及高級特性。 一、算子核心概念&#xff1a;流處理的"原子操作 1. 數據流拓撲&#xff08;Stream Topology&#x…

Flask 入門到實戰(2):使用 SQLAlchemy 打造可持久化的數據層

Flask 入門到實戰&#xff1a;使用 SQLAlchemy 打造可持久化的數據層一、前言&#xff1a;為什么用 Flask-SQLAlchemy&#xff1f; 在 Python Web 開發中&#xff0c;操作數據庫的方式主要有兩種&#xff1a; 直接寫 SQL&#xff08;繁瑣且難維護&#xff09;使用 ORM&#xff…

50天50個小項目 (Vue3 + Tailwindcss V4) ? | GithubProfies(GitHub 個人資料)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— GithubProfies組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API&#xff08;<script setup…

simscape中坐標系和坐標變換Frames and Transforms

為了更便捷地描述單個物體的運動&#xff0c;最好以該物體的質心為坐標原點建立坐標系&#xff0c;從而可以非常方便地描述其旋轉運動。因此&#xff0c;在計算多個物體之間的位置關系時&#xff0c;為了計算方便&#xff0c;需要頻繁地更換坐標框架&#xff0c;這也是multibod…

構建分布式光伏“四可”能力:支撐新型電力系統安全穩定運行的關鍵路徑

隨著我國新能源裝機規模的跨越式增長&#xff0c;國家能源戰略對新能源電站的規范化接入與精細化調度管理提出了更高要求。在電力市場化改革深化與新型電力系統構建的關鍵時期&#xff0c;保障電網安全穩定、提升新能源高效消納能力已成為核心議題。國家能源局于2025年1月17日正…

UART寄存器介紹

在 STM32 微控制器中&#xff0c;UART&#xff08;通用異步收發傳輸器&#xff09;通信通過多個寄存器實現配置和數據傳輸。下面詳細解析 UART 的核心寄存器及其功能。1. 狀態寄存器&#xff08;USART_SR&#xff09;狀態寄存器反映 UART 當前的工作狀態&#xff0c;用于判斷數…

寫一個算法對一組值進行歸一化映射,使它們在視覺上有明顯的區分度,尤其在數據集分布不均時仍能體現差異

問題&#xff1a; 有一批數據&#xff0c;都是隨機值范圍是不確定&#xff0c;我需要用這個值來繪制同樣數量圓&#xff0c;不同值他們的圓半徑不同&#xff0c;考慮到數據有時候大小偏差不大&#xff0c;這1000個值有可能是集中在10,20之間&#xff0c;也可能是分布廣泛&#…

具身智能零碎知識點(五):VAE中對使用KL散度的理解

VAE中對使用KL散度的理解什么是 VAE (Variational AutoEncoder)&#xff1f;從自編碼器 (AE) 說起VAE&#xff1a;讓潛在空間變得“有意義”和“連續”KL 散度是如何用到的&#xff1f;通俗理解 KL 散度在 VAE 中的作用&#xff1a;帶來的好處&#xff1a;KL 散度公式 (無需背誦…

理解:進程、線程、協程

線程、進程和協程是并發編程的重要組成部分。進程&#xff08;Process&#xff09;定義進程是操作系統分配資源的基本單位&#xff0c;表示一個正在執行的程序。一旦一個程序被加載到內存中&#xff0c;它就成為一個進程&#xff0c;而每個進程都有其獨立的內存空間。特征進程之…

總結一下找素數的三種方法

目錄 一試除法 二埃氏篩 三線性篩(歐拉篩) 一試除法 思想&#xff1a;就是判斷某個數x是不是素數,就判斷從2開始到小于根號x的范圍內有沒有能夠取余不等于0的,這個說明當前值就是x的一個因子&#xff0c;所以不是素數。 代碼&#xff1a; import java.util.Scanner;public…

基于Yolov8車輛檢測及圖像處理系統【有代碼】

0 引言 隨著城市化進程的加速和機動車保有量的快速增長,交通管理、智能監控和自動駕駛等領域對車輛目標檢測技術的需求日益增長。車輛目標檢測是計算機視覺領域的一個重要研究方向,其目標是從圖像或視頻序列中準確識別和定位車輛,為后續的車輛跟蹤、行為分析和交通流量統計…

MySQL密碼管理器“mysql_config_editor“

目錄 核心能力 常用命令速查 為什么更安全&#xff1f; 典型場景 mysql_config_editor 是 MySQL 官方自帶的一款命令行小工具&#xff0c;作用一句話&#xff1a;把賬號、密碼、主機、端口等連接信息加密存起來&#xff0c;下次連接時只敲一個名字即可&#xff0c;不用再寫…

Kubernetes高級調度01

目錄 第一章&#xff1a;初始化容器&#xff08;InitContainer&#xff09;—— 應用啟動前的 “準備軍” 1.1 InitContainer 的基本概念與核心特性 1.2 InitContainer 與普通容器的關鍵區別 1.3 InitContainer 的實戰場景與示例解析 1.3.1 示例 1&#xff1a;延遲啟動 —…