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.mzph.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…