Spring Boot項目中結合MyBatis實現MySQL的自動主從切換

原理解析

1. MySQL主從復制(Master-Slave Replication)
  • 工作原理:MySQL主從復制通過二進制日志(binary log)來同步數據。主服務器記錄所有更改操作到二進制日志中,從服務器讀取這些日志并執行相應的SQL語句來保持與主服務器的數據一致。
  • 延遲問題:由于網絡傳輸和處理時間,從庫可能會有短暫的數據滯后,這對于需要實時一致性的場景是一個挑戰。
2. 讀寫分離
  • 目的:提高系統性能和可用性。通過將讀請求分配給從庫,寫請求發送給主庫,可以減少主庫的壓力,提升系統的整體性能。
  • 實現方式:可以通過數據庫中間件或框架層面的配置來實現。在這個例子中,我們使用Apache ShardingSphere來實現讀寫分離。
3. 自動故障轉移
  • 原理:當檢測到主庫不可用時,系統會自動選擇一個從庫作為新的主庫,并重新調整讀寫分配。這通常涉及到心跳檢測、狀態監控等機制。
  • 工具支持:除了ShardingSphere外,還可以使用MHA(MySQL Master High Availability)或其他高可用解決方案。

實現步驟詳解

1. 引入依賴

pom.xml中添加必要的依賴,包括Spring Boot Starter、MyBatis Starter以及ShardingSphere:

 

xml

深色版本

<dependencies><!-- Spring Boot Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- MyBatis Starter --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version></dependency><!-- ShardingSphere for read-write splitting --><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.1.1</version></dependency>
</dependencies>
2. 配置數據源

編輯application.yml文件以配置多個數據源,并設置ShardingSphere規則以實現讀寫分離:

 

yaml

深色版本

spring:shardingsphere:datasource:names: master,slave0,slave1master:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://master_host:3306/your_db?useSSL=false&serverTimezone=UTCusername: your_usernamepassword: your_passwordslave0:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://slave0_host:3306/your_db?useSSL=false&serverTimezone=UTCusername: your_usernamepassword: your_passwordslave1:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://slave1_host:3306/your_db?useSSL=false&serverTimezone=UTCusername: your_usernamepassword: your_passwordmasterslave:load-balance-algorithm-type: round_robin # 負載均衡策略name: ms_ds # 數據源名稱master-data-source-name: master # 主庫數據源名稱slave-data-source-names: slave0,slave1 # 從庫數據源名稱列表props:sql:show: true # 是否顯示SQL語句
3. 配置MyBatis

創建MyBatis Mapper接口,并使用注解或XML配置SQL語句。這里以注解方式為例:

 

java

深色版本

package com.example.demo.mapper;import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;import java.util.List;
import java.util.Map;@Mapper
public interface UserMapper {/*** 查詢所有用戶信息.* 注意:對于查詢操作,ShardingSphere會選擇其中一個從庫來執行查詢。** @return 用戶信息列表*/@Select("SELECT * FROM users")List<Map<String, Object>> findAllUsers();/*** 更新用戶信息.* 注意:寫操作只會針對主庫執行。** @param id 用戶ID* @param newName 新用戶名*/void updateUserById(@Param("id") Long id, @Param("newName") String newName);
}

確保你的Spring Boot應用掃描到Mapper接口。可以在主類上添加@MapperScan注解:

 

java

深色版本

package com.example.demo;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}
4. 使用Mapper進行數據庫操作

現在你可以在Service層中注入并使用Mapper接口來進行數據庫操作:

 

java

深色版本

package com.example.demo.service;import com.example.demo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;
import java.util.Map;@Service
public class UserService {@Autowiredprivate UserMapper userMapper;/*** 獲取所有用戶信息.** @return 用戶信息列表*/public List<Map<String, Object>> getAllUsers() {return userMapper.findAllUsers();}/*** 更新用戶名稱.** @param id       用戶ID* @param newName 新用戶名*/public void updateUserName(Long id, String newName) {userMapper.updateUserById(id, newName);}
}

注意事項及最佳實踐

  • 事務管理:確保所有寫操作都在同一個事務中執行,并且只對主庫進行寫操作。可以使用@Transactional注解來管理事務。

  • 數據一致性:考慮到主從復制延遲的問題,在某些場景下(如剛完成寫操作后立即讀取),可能需要直接查詢主庫以保證數據一致性。

  • 健康檢查:建議定期監控主從狀態,確保從庫同步正常以及主庫可訪問。可以通過定時任務或者外部工具來實現。

  • 性能優化:根據實際業務需求調整負載均衡策略,例如采用權重輪詢或其他高級算法來優化查詢效率。

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

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

相關文章

【經驗記錄貼】使用配置文件提高項目的可維護性

mark一下。 整體修改前后如下&#xff1a; 課題&#xff1a; 在項目中有一個支持的文件類型的FILE_TYPE的定義&#xff0c; 這個是寫死在主程序中&#xff0c;每次增加可以支持的文件類型的時候&#xff0c;都需要去修改主程序中這個FILGE_TYPE的定義。 主程序修改其實不太花時…

用DeepSeek AI高效制作專業PPT

在當今職場中,制作精美而有力的PPT是展示想法、匯報工作和贏得機會的關鍵技能。然而,許多人花費過多時間在格式調整和內容組織上,而非專注于核心信息的傳達。DeepSeek AI作為新一代智能助手,能夠幫助您將PPT制作效率提升300%,同時顯著提高專業度。本文將詳細介紹如何利用D…

【AI學習從零至壹】語?模型及詞向量相關知識

語?模型及詞向量相關知識 ?然語?處理簡介?然語?理解&#xff08;NLU&#xff09;?然語??成&#xff08;NLG&#xff09;發展趨勢信息檢索技術布爾檢索與詞袋模型基于相關性的檢索 / TF-IDF舉例&#xff1a; 語?模型 / Language Model神經?絡語?模型Word2Vec訓練?法…

15.【.NET 8 實戰--孢子記賬--從單體到微服務--轉向微服務】--單體轉微服務--如何拆分單體

單體應用&#xff08;Monolithic Application&#xff09;是指將所有功能模塊集中在一個代碼庫中構建的應用程序。它通常是一個完整的、不可分割的整體&#xff0c;所有模塊共享相同的運行環境和數據庫。這種架構開發初期較為簡單&#xff0c;部署也較為方便&#xff0c;但隨著…

在ARM架構Mac上部署Python 3.12與Conda環境的全鏈路指南!!!

在ARM架構Mac上部署Python 3.12與Conda環境的全鏈路指南 &#x1f680; &#xff08;M1/M2芯片實測&#xff5c;含性能調優避坑手冊&#xff09; &#x1f31f; 核心價值點 ? 原生ARM支持&#xff1a;突破Rosetta轉譯的性能損耗 ? 環境隔離&#xff1a;Conda虛擬環境管理多…

yml文件上傳并映射到實體類

文章目錄 功能背景功能需要前端開發組件選用組件嵌套和參數綁定上傳邏輯示例 后端開發接收邏輯解析邏輯省流純手動實現&#xff08;不建議&#xff09; 功能背景 開發一個配置文件解析功能&#xff0c;需要兼容老版本的配置文件。 功能需要 前端&#xff1a;兩個配置文件分別…

ElasticSearch中常用的數據類型

一、映射 Elasticsearch中通過映射來指定字段的數據類型&#xff0c;映射方式有2種&#xff0c;靜態映射和動態映射。 1.動態映射 使用動態映射時&#xff0c;無須指定字段的數據類型&#xff0c;Elasticshearch會自動根據字段內容來判斷映射到哪個數據類型。 比如&#xff…

【神經網絡結構的組成】深入理解 轉置卷積與轉置卷積核

&#x1f308; 個人主頁&#xff1a;十二月的貓-CSDN博客 &#x1f525; 系列專欄&#xff1a; &#x1f3c0;《深度學習理論直覺三十講》_十二月的貓的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻擋不了春天的腳步&#xff0c;十二點的黑夜遮蔽不住黎明的曙光 …

CSS高度坍塌?如何解決?

一、什么是高度坍塌&#xff1f; 高度坍塌&#xff08;Collapsing Margins&#xff09;是指當父元素沒有設置邊框&#xff08;border&#xff09;、內邊距&#xff08;padding&#xff09;、內容&#xff08;content&#xff09;或清除浮動時&#xff0c;其子元素的 margin 會…

Web前端開發——格式化文本與段落(上)

一、學習目標 網頁內容的排版包括文本格式化、段落格式化和整個頁面的格式化&#xff0c;這是設計個網頁的基礎。文本格式化標記分為字體標記、文字修飾標記。字體標記和文字修飾標記包括對于字體樣式的一些特殊修改。段落格式化標記分為段落標記、換行記、水平分隔線標記等。…

關于PHP開源CMS系統ModStart的詳細介紹及使用指南

關于PHP開源CMS系統ModStart的詳細介紹及使用指南&#xff1a; &#x1f50d; ModStart是什么&#xff1f; 基于Laravel框架開發的模塊化CMS系統采用Apache 2.0 開源協議&#xff0c;完全免費可商用特別適合需要快速搭建企業級網站/管理系統的開發者 &#x1f680; 核心優勢…

TCP標志位抓包

說明 TCP協議的Header信息&#xff0c;URG、ACK、PSH、RST、SYN、FIN這6個字段在14字節的位置&#xff0c;對應的是tcp[13]&#xff0c;因為字節數是從[0]開始數的&#xff0c;14字節對應的就是tcp[13]&#xff0c;因此在抓這幾個標志位的數據包時就要明確范圍在tcp[13] 示例1…

RK3588S開發板將SPI1接口改成GPIO

參考官方教程&#xff1a;ROC-RK3588S-PC 一.基本知識&#xff1a; 1.GPIO引腳計算&#xff1a; ROC-RK3588S-PC 有 5 組 GPIO bank&#xff1a;GPIO0~GPIO4&#xff0c;每組又以 A0~A7, B0~B7, C0~C7, D0~D7 作為編號區分&#xff0c;常用以下公式計算引腳&#xff1a;GPIO…

Java 設計模式:適配器模式詳解

Java 設計模式&#xff1a;適配器模式詳解 適配器模式&#xff08;Adapter Pattern&#xff09;是一種結構型設計模式&#xff0c;它通過將一個類的接口轉換為客戶端期望的另一個接口&#xff0c;使原本不兼容的類能夠協同工作。適配器模式就像現實生活中的電源適配器&#xf…

python manimgl數學動畫演示_微積分_線性代數原理_ubuntu安裝問題[已解決]

1.背景 最近調研python opencv, cuda加速矩陣/向量運算, 對于矩陣的線性變換, 秩, 轉秩, 行列式變化等概概念模糊不清. 大概課本依舊是天書, 于是上B站搜索線性代數, 看到 3Blue1Brown 線性變換本質 視頻, 點擊觀看. 驚為天人 --> 豁然開朗 --> 突然頓悟 --> 開心不已…

Git 學習筆記

這篇筆記記錄了我在git學習中常常用到的指令&#xff0c;方便在未來進行查閱。此篇文章也會根據筆者的學習進度持續更新。 網站分享 Git 常用命令大全 Learn Git Branching 基礎 $ git init //在當前位置配置一個git版本庫 $ git add <file> //將文件添加至…

Dynamics365 ExportPdfTemplateExportWordTemplate兩個Action調用的body構造

這兩天在用ExportPdfTemplate做pdf導出功能時&#xff0c;遇到了如下問題InnerException : Microsoft.OData.ODataException: An unexpected StartArray node was found when reading from the JSON reader. A PrimitiveValue node was expected. 我的場景是使用power automate…

經典算法 判斷一個圖是不是樹

判斷一個圖是不是樹 問題描述 給一個以0 0結尾的整數對列表&#xff0c;除0 0外的每兩個整數表示一條連接了這兩個節點的邊。假設節點編號不超過100000大于0。你只要判斷由這些節點和邊構成的圖是不是樹。是輸出YES&#xff0c;不是輸出NO。 輸入樣例1 6 8 5 3 5 2 6 4 5…

【嵌入式八股2】C++:STL容器與算法

1. STL常見容器及其內部實現的數據結構 序號 名稱 描述 存儲結構 常用方法和操作 1vector動態分配的數組順序數組&#xff08;array&#xff09;v.push_back(), v.pop_back(), v.insert(), v.erase(), v.capacity(), v.size(), v.at(idx), v.front(), v.back()2list雙向鏈表離…

vmcore分析鎖問題實例(x86-64)

問題描述&#xff1a;系統出現panic&#xff0c;dmesg有如下打印&#xff1a; [122061.197311] task:irq/181-ice-enp state:D stack:0 pid:3134 ppid:2 flags:0x00004000 [122061.197315] Call Trace: [122061.197317] <TASK> [122061.197318] __schedule0…