Spring Boot + MyBatis-Plus 讀寫分離與多 Slave 負載均衡示例

Spring Boot + MyBatis-Plus 讀寫分離與多 Slave 負載均衡示例

一、項目結構

src/main/java/com/example/demo/
├── config/
│   ├── DataSourceConfig.java         # 數據源配置
│   ├── MyBatisPlusConfig.java        # MyBatis-Plus配置
├── constant/
│   ├── DataSourceType.java           # 數據源類型枚舉
├── context/
│   ├── DataSourceContextHolder.java  # 數據源上下文
├── aspect/
│   ├── DataSourceAspect.java         # 注解驅動的數據源切換
│   ├── DataSourceRouteAspect.java    # 自動路由的數據源切換
├── annotation/
│   ├── DataSource.java               # 自定義數據源注解
├── loadbalancer/
│   ├── SlaveDataSourceLoadBalancer.java # 從庫負載均衡器
├── mapper/
│   ├── UserMapper.java               # DAO接口
├── service/
│   ├── UserService.java              # 服務接口
│   ├── impl/
│       └── UserServiceImpl.java      # 服務實現
├── controller/
│   ├── UserController.java           # 控制器
└── DemoApplication.java              # 啟動類

二、核心代碼實現

(一)數據源類型枚舉

// constant/DataSourceType.java
package com.example.demo.constant;public enum DataSourceType {MASTER,SLAVE_1,SLAVE_2,SLAVE_3
}

(二)數據源上下文

// context/DataSourceContextHolder.java
package com.example.demo.context;import com.example.demo.constant.DataSourceType;public class DataSourceContextHolder {private static final ThreadLocal<DataSourceType> contextHolder = new ThreadLocal<>();public static void setDataSource(DataSourceType type) {contextHolder.set(type);}public static DataSourceType getDataSource() {return contextHolder.get();}public static void clearDataSource() {contextHolder.remove();}
}

(三)動態數據源

// config/DynamicRoutingDataSource.java
package com.example.demo.config;import com.example.demo.context.DataSourceContextHolder;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;public class DynamicRoutingDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return DataSourceContextHolder.getDataSource();}
}

(四)數據源配置

// config/DataSourceConfig.java
package com.example.demo.config;import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.example.demo.constant.DataSourceType;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;@Configuration
public class DataSourceConfig {@Primary@Bean(name = "masterDataSource")@ConfigurationProperties("spring.datasource.master")public DataSource masterDataSource() {return DruidDataSourceBuilder.create().build();}@Bean(name = "slave1DataSource")@ConfigurationProperties("spring.datasource.slave1")public DataSource slave1DataSource() {return DruidDataSourceBuilder.create().build();}@Bean(name = "slave2DataSource")@ConfigurationProperties("spring.datasource.slave2")public DataSource slave2DataSource() {return DruidDataSourceBuilder.create().build();}@Bean(name = "slave3DataSource")@ConfigurationProperties("spring.datasource.slave3")public DataSource slave3DataSource() {return DruidDataSourceBuilder.create().build();}@Beanpublic DataSource dynamicDataSource() {DynamicRoutingDataSource dynamicDataSource = new DynamicRoutingDataSource();// 設置默認數據源dynamicDataSource.setDefaultTargetDataSource(masterDataSource());// 設置多數據源映射Map<Object, Object> targetDataSources = new HashMap<>();targetDataSources.put(DataSourceType.MASTER, masterDataSource());targetDataSources.put(

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

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

相關文章

android binder(1)基本原理

一、IPC 進程間通信&#xff08;IPC&#xff0c;Inter-Process Communication&#xff09;機制&#xff0c;用于解決不同進程間的數據交互問題。 不同進程之間用戶地址空間的變量和函數是不能相互訪問的&#xff0c;但是不同進程的內核地址空間是相同和共享的&#xff0c;我們可…

高密爆炸警鐘長鳴:AI為化工安全戴上“智能護盾”

一、高密爆炸&#xff1a;一聲巨響&#xff0c;撕開化工安全“傷疤” 2025年5月27日&#xff0c;山東高密友道化學有限公司的車間爆炸聲&#xff0c;像一把利刃劃破了化工行業的平靜。劇烈的沖擊波將車間夷為平地&#xff0c;黑色蘑菇云騰空而起&#xff0c;刺鼻的化學氣味彌漫…

雙擎驅動:華為云數字人與DeepSeek大模型的智能交互升級方案

一、技術融合概述 華為云數字人 華為云數字人&#xff0c;全稱&#xff1a;數字內容生產線 MetaStudio。數字內容生產線&#xff0c;提供數字人視頻制作、視頻直播、智能交互、企業代言等多種服務能力&#xff0c;使能千行百業降本增效。另外&#xff0c;數字內容生產線&#…

Linux運維筆記:1010實驗室電腦資源規范使用指南

文章目錄 一. 檢查資源使用情況&#xff0c;避免沖突1. 檢查在線用戶2. 檢查 CPU 使用情況3. 檢查 GPU 使用情況4. 協作建議 二. 備份重要文件和數據三. 定期清理硬盤空間四. 退出 ThinLinc 時注銷&#xff0c;釋放內存五. 校外使用時配置 VPN注意事項 總結 實驗室的電腦配備了…

手機郵箱APP操作

收發電子郵件方式 郵箱可以在網絡段登錄&#xff0c;也可以在手機端登錄。 大學網絡服務 收發電子郵件有三種方式&#xff1a; 1、Web方式&#xff1a; 1&#xff09;登錄“網絡服務”&#xff08;https://its.pku.edu.cn&#xff09;&#xff0c;點頁面頂端“郵箱”。 2&…

Dockerfile 使用多階段構建(build 階段 → release 階段)后端配置

錯誤Dockerfile配置示例&#xff1a; FROM python:3.11 as buildENV http_proxyhttp://172.17.0.1:7890 ENV https_proxyhttp://172.17.0.1:7890WORKDIR /appENV PYTHONPATH/app# Install Poetry # RUN curl -sSL https://install.python-poetry.org | POETRY_HOME/opt/poetry…

webstrom中git插件勾選提交部分文件時卻出現提交全部問題怎么解決

原因是我有個.husky的文件制定了執行提交的時候就是提交所有的文件 修改.husky/pre-commit文件就可以啦 #!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh"# 獲取通過 WebStorm 提交的暫存文件&#xff08;僅勾選的部分&#xff09; STAGED_FILES$(gi…

OSG編譯wasm嘗試

最近遇到一個情況&#xff0c;需要嘗試一下OSG到webassembly 發現官網有教程 于是順著看了看&#xff0c;默認教程是xubuntu的一個系統跑的&#xff0c;但是我本著試一試的想法&#xff0c;拉下來直接在windows上跑&#xff0c;奇奇怪怪的報錯簡直頭皮發麻 然后怎么辦呢&#x…

QT中子線程觸發主線程彈窗并阻塞等待用戶響應-傳統信號槽實現

目錄 QT中子線程觸發主線程彈窗并阻塞等待用戶響應傳統信號槽實現實現思路具體步驟1. 定義信號與槽2. 異步任務中觸發彈窗3. 主線程處理彈窗4. 連接信號與槽關鍵點總結 更簡單實現 QT中子線程觸發主線程彈窗并阻塞等待用戶響應 傳統信號槽實現 場景需求&#xff1a;在子線程執…

STM32學習之WWDG(原理+實操)

&#x1f4e2;&#xff1a;如果你也對機器人、人工智能感興趣&#xff0c;看來我們志同道合? &#x1f4e2;&#xff1a;不妨瀏覽一下我的博客主頁【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸對你有幫助&#xff0c;可點贊 &#x1f44d;…

【端午安康】龍舟爭渡Plug-In

文章目錄 正文附錄A&#xff1a;關于Python的錄屏方法總結&#xff08;來自DeepSeek的回答&#xff09;1. 使用 pyautogui 和 OpenCV 錄制屏幕2. 使用 mss 庫&#xff08;高效屏幕捕獲&#xff09;3. 使用 PIL.ImageGrab 錄制屏幕4. 使用 Windows 原生快捷鍵錄制&#xff08;非…

Apache SeaTunnel部署技術詳解:模式選擇、技巧與最佳實踐

Apache SeaTunnel(原Waterdrop)作為高性能、分布式數據集成平臺,支持海量數據的離線與實時同步。其靈活多樣的部署模式可適配不同規模的生產環境需求。本文將系統解析SeaTunnel的部署架構、技術要點及最佳實踐,幫助用戶高效構建穩定可靠的數據管道。 一、部署模式全景概覽 …

【機械視覺】Halcon—【六、交集并集差集和仿射變換】

【機械視覺】Halcon—【六、交集并集差集和仿射變換】 目錄 【機械視覺】Halcon—【六、交集并集差集和仿射變換】 介紹 交集并集差集介紹: 1. 交集&#xff08;Intersection&#xff09; 2. 并集&#xff08;Union&#xff09; 3. 差集&#xff08;Difference&#xff…

實驗設計與分析(第6版,Montgomery)第5章析因設計引導5.7節思考題5.6 R語言解題

本文是實驗設計與分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅玨生譯) 第5章析因設計引導5.7節思考題5.6 R語言解題。主要涉及方差分析&#xff0c;正態假設檢驗&#xff0c;殘差分析&#xff0c;交互作用圖&#xff0c;等值線圖。 dataframe <-data.frame…

劍指offer15_數值的整數次方

數值的整數次方 實現函數 double Power(double base, int exponent) 題目要求 計算 base exponent \text{base}^{\text{exponent}} baseexponent&#xff1a; 不得使用庫函數不需要考慮大數問題&#xff0c;絕對誤差不超過 10 ? 2 10^{-2} 10?2不會出現底數和指數同為 0…

【Typst】1.Typst概述

概述 Typst是一種用于排版文檔的標記語言&#xff0c;可以用于排版各種精美的論文、文章、書籍、報告和作業等。它是LaTex的精神續作&#xff0c;但是運行環境和編譯速度都要更簡單、更快捷。 它設計了一種腳本結合簡單的標記語法實現復雜的排版效果。并且支持模板創建、文件…

[Java惡補day14] 56. 合并區間

以數組 intervals 表示若干個區間的集合&#xff0c;其中單個區間為 intervals[i] [starti, endi] 。請你合并所有重疊的區間&#xff0c;并返回 一個不重疊的區間數組&#xff0c;該數組需恰好覆蓋輸入中的所有區間 。 示例 1&#xff1a; 輸入&#xff1a;intervals [[1,3…

DiskGenius專業版v6.0.1.1645:分區管理、數據恢復、備份還原,一應俱全!

各位小伙伴&#xff0c;大家好&#xff01;今天阿燦給大家帶來一款超好用的分區工具&#xff0c;DiskGenius專業版。這款工具堪稱電腦管理界的“瑞士軍刀”&#xff0c;功能強大&#xff0c;現在出了新版本v6.0.1.1645&#xff0c;簡繁中文單文件便攜版&#xff0c;使用超方便。…

azure web app創建分步指南系列之二

為注冊表授權托管標識 你創建的托管標識尚未獲得從容器注冊表中提取數據的授權。在此步驟中,你將啟用授權。 返回容器注冊表的管理頁面: 在左側導航菜單中,選擇“訪問控制 (IAM)”。選擇“添加角色分配”。此屏幕截圖顯示了如何為容器注冊表啟用添加角色分配。在角色列表中…

STM32 AD單通道與多通道實戰指南

文章目錄 AD單通道&#xff08;實驗&#xff09;有關配置的庫函數AD單通道部分主要代碼 AD多通道實現多通道采集實現思路探討單次轉換非掃描模式實現AD多通道AD多通道部分代碼 學習建議&#xff1a;推薦搭配 江協科技 AD單通道 AD多通道一起食用&#xff01;&#xff01;&#…