Spring Boot3 配合ProxySQL实现对 MySQL 主从同步的读写分离和负载均衡
将 ProxySQL 配合 Spring Boot 使用,主要的目的是在 Spring Boot 应用程序中实现对 MySQL 主从同步的读写分离和负载均衡。这样,你可以利用 ProxySQL 自动将写操作路由到主库,而将读操作路由到从库。
1. 准备工作
确保你的 MySQL 主从同步环境和 ProxySQL 已经成功配置并正常工作。接下来,我们将进行以下几个步骤:
- 配置 Spring Boot 连接 ProxySQL。
- 配置 数据源 来支持读写分离。
2. 修改 Spring Boot 配置
在 Spring Boot 项目中,配置数据库连接时,使用 ProxySQL 作为 MySQL 的代理。你需要将 Spring Boot 的 数据源配置 进行一些调整,以支持读写分离。
1.1 配置 application.yml
(或 application.properties
)
你可以在 application.yml
中配置多个数据源,分别对应主库和从库。ProxySQL 会作为一个代理处理读写分离。
示例:application.yml
spring:datasource:# 主数据源 (写库)primary:url: jdbc:mysql://127.0.0.1:6033/mydbusername: your_userpassword: your_passworddriver-class-name: com.mysql.cj.jdbc.Driverhikari:maximum-pool-size: 10minimum-idle: 5pool-name: PrimaryPool# 从数据源 (读库)secondary:url: jdbc:mysql://127.0.0.1:6033/mydbusername: your_userpassword: your_passworddriver-class-name: com.mysql.cj.jdbc.Driverhikari:maximum-pool-size: 10minimum-idle: 5pool-name: SecondaryPool# 设置数据源的路由策略jpa:hibernate:ddl-auto: updateproperties:hibernate:dialect: org.hibernate.dialect.MySQL8Dialectshow-sql: truedatabase-platform: org.hibernate.dialect.MySQL8Dialect
在这个配置文件中:
- 主数据源(primary)用于写入操作,连接到 ProxySQL 的主库。
- 从数据源(secondary)用于读取操作,连接到 ProxySQL 的从库。
ProxySQL 会根据 SQL 语句的类型(SELECT
路由到从库,INSERT
/UPDATE
路由到主库)自动分配流量。
1.2 配置 DataSource
路由
Spring Boot 默认只支持单个数据源。如果你需要同时配置多个数据源(主从分离),需要定义一个 数据源路由 类,将请求的数据库连接动态路由到主库或从库。
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.example.repository")
public class DataSourceConfig {@Primary@Bean(name = "primaryDataSource")@ConfigurationProperties(prefix = "spring.datasource.primary")public DataSource dataSource() {return DataSourceBuilder.create().build();}@Bean(name = "secondaryDataSource")@ConfigurationProperties(prefix = "spring.datasource.secondary")public DataSource secondaryDataSource() {return DataSourceBuilder.create().build();}// 配置EntityManagerFactory和TransactionManager@Bean(name = "entityManagerFactory")public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("primaryDataSource") DataSource dataSource) {return builder.dataSource(dataSource).packages("com.example.model") // 你的实体类包路径.persistenceUnit("primary").build();}@Bean(name = "transactionManager")public PlatformTransactionManager transactionManager(@Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) {return new JpaTransactionManager(entityManagerFactory);}
}
在这个配置中,我们定义了两个数据源:primaryDataSource
和 secondaryDataSource
,分别连接到 ProxySQL 的主库和从库。
3. 实现动态数据源路由
为了动态选择使用主库还是从库,你可以使用一个 AbstractRoutingDataSource
来实现动态的数据源路由。
public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {// 判断当前线程中是否有读请求或者写请求,选择数据源return DataSourceContextHolder.getDataSourceType();}
}
然后创建一个 DataSourceContextHolder
用来管理当前线程的数据源类型。
public class DataSourceContextHolder {private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();public static void setDataSourceType(String dataSourceType) {contextHolder.set(dataSourceType);}public static String getDataSourceType() {return contextHolder.get();}public static void clearDataSourceType() {contextHolder.remove();}
}
4. 配置 Service 层的读写分离
接下来,你需要在服务层中手动切换读写操作的数据源。通常,你可以通过注解来区分读操作和写操作。
@Service
public class UserService {@Transactionalpublic void saveUser(User user) {// 使用主库保存数据DataSourceContextHolder.setDataSourceType("primary");userRepository.save(user);DataSourceContextHolder.clearDataSourceType();}public User getUser(Long id) {// 使用从库查询数据DataSourceContextHolder.setDataSourceType("secondary");User user = userRepository.findById(id).orElse(null);DataSourceContextHolder.clearDataSourceType();return user;}
}
在上面的代码中,saveUser
方法会选择主库,而 getUser
方法会选择从库。
5. 配置 Spring AOP 自动切换数据源(可选)
你可以通过 AOP 来简化读写分离的配置,使得你不需要手动设置数据源类型。只需在方法上使用自定义注解(如 @ReadOnly
和 @WriteOnly
),自动切换数据源。
自定义注解:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ReadOnly {
}@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface WriteOnly {
}
创建 AOP 切面:
@Aspect
@Component
public class DataSourceAspect {@Before("@annotation(ReadOnly)")public void setReadOnlyDataSource() {DataSourceContextHolder.setDataSourceType("secondary");}@Before("@annotation(WriteOnly)")public void setWriteOnlyDataSource() {DataSourceContextHolder.setDataSourceType("primary");}@After("@annotation(ReadOnly) || @annotation(WriteOnly)")public void clearDataSource() {DataSourceContextHolder.clearDataSourceType();}
}
在这段代码中:
- 使用
@ReadOnly
注解的方法将会切换到从库。 - 使用
@WriteOnly
注解的方法将会切换到主库。
6. 总结
通过以上步骤,你可以将 ProxySQL 与 Spring Boot 集成,实现 MySQL 主从同步的读写分离和负载均衡。
- ProxySQL 作为 MySQL 的代理,负责将读请求路由到从库,写请求路由到主库。
- Spring Boot 通过配置多个数据源和动态路由来实现读写分离。
- 你可以通过 AOP 或手动设置来决定何时使用主库或从库。
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
Spring Boot3 配合ProxySQL实现对 MySQL 主从同步的读写分离和负载均衡
将 ProxySQL 配合 Spring Boot 使用,主要的目的是在 Spring Boot 应用程序中实现对 MySQL 主从同步的读写分离和负载均衡。这样,你可以利用 ProxySQL 自动将写操作路由到主库,而将读操作路由到从库。 1. 准备工作 确保你的 MySQL 主从同步环…...
![](https://img-blog.csdnimg.cn/img_convert/afd69b45eb77d0f51a9fc67a011f5312.jpeg)
量子计算遇上人工智能:突破算力瓶颈的关键?
引言:量子计算遇上人工智能——突破算力瓶颈的关键? 在数字化时代的浪潮中,人工智能(AI)正以前所未有的速度改变着我们的生活,从语音助手到自动驾驶,从医学诊断到金融分析,无不彰显其…...
![](https://i-blog.csdnimg.cn/direct/9f1b2f02ab724c0387dfc67a9f32c711.png)
【Unity插件】解决移动端UI安全区问题 - Safe Area Helper
在移动端设计界面时,必须要考虑的就是UI的安全区。 Unity本身也提供了Safearea的API。 但在asset store时已经有人提供了免费的插件(Safe Area Helper),我们可以直接使用。 插件链接: https://assetstore.unity.com/p…...
![](https://www.ngui.cc/images/no-images.jpg)
JSON.stringify 实现深度克隆的缺陷
在前端开发中,深克隆(Deep Clone)和浅克隆(Shallow Clone)是常见的操作。浅克隆和深克隆的区别主要体现在对象内部嵌套对象的处理方式上。 1. 浅克隆(Shallow Clone) 浅克隆是指创建一个新对象…...
![](https://i-blog.csdnimg.cn/direct/02b6673fa6a04f47861e77be53f77d80.png)
深度解析如何使用Linux中的git操作
1.如何理解版本控制 →Git&&gitee||github 多版本控制面对善变的甲方 版本控制是一种用于管理文件或代码变更的系统,帮助团队或个人追踪项目的历史记录,并支持多方协作开发。它在软件开发和文档管理中尤为重要,但也适用于其他需要追…...
![](https://i-blog.csdnimg.cn/direct/2681db1202d342d79bb28d8ca2468ccf.png)
el-table 合并单元格
参考文章:vue3.0 el-table 动态合并单元格 - flyComeOn - 博客园 <el-table :data"tableData" border empty-text"暂无数据" :header-cell-style"{ background: #f5f7fa }" class"parent-table" :span-method"obj…...
![](https://www.ngui.cc/images/no-images.jpg)
Redis 三大问题:缓存穿透、缓存击穿、缓存雪崩
Redis 作为高性能的内存数据库,广泛应用于缓存场景。然而,在实际使用中,可能会遇到三大经典问题:缓存穿透、缓存击穿 和 缓存雪崩。这些问题如果不加以解决,可能会导致系统性能下降甚至崩溃。 1. 缓存穿透 问题描述 …...
![](https://www.ngui.cc/images/no-images.jpg)
常用字符串处理函数
常用字符串处理函数 strcspn函数原型参数说明返回值使用示例注意事项 strpbrk函数原型参数说明返回值使用示例 strcasecmp函数原型参数说明返回值使用示例注意事项 strcspn strcspn 是一个 C 和 C 标准库函数,用于计算一个字符串中不包含任何指定字符的最长前缀的长…...
![](https://i-blog.csdnimg.cn/img_convert/d4650b69e387ef1c51998b8d2dd446f7.png)
Pathview包:整合表达谱数据可视化KEGG通路
Pathview是一个用于整合表达谱数据并用于可视化KEGG通路的一个R包,其会先下载KEGG官网上的通路图,然后整合输入数据对通路图进行再次渲染,从而对KEGG通路图进行一定程度上的个性化处理,并且丰富其信息展示。(KEGG在线数…...
![](https://www.ngui.cc/images/no-images.jpg)
seleniun 自动化程序,python编程 我监控 chrome debug数据后 ,怎么获取控制台的信息呢
python 好的,使用 Python 来监控 Chrome 的调试数据并获取控制台信息,可以使用 websocket-client 库来连接 Chrome 的 WebSocket 接口。以下是一个详细的示例: 1. 安装必要的库 首先,你需要安装 websocket-client 库。可以使用…...
![](https://www.ngui.cc/images/no-images.jpg)
SQL中的数据库对象
视图:VIEW 概念 ① 虚拟表,本身不存储数据,可以看做是存储起来的SELECT语句 ② 视图中SELECT语句中涉及到的表,称为基表 ③ 针对视图做DML操作,对影响到基表中的数据,反之亦然 ④ 创建、删除视图本身&#…...
![](https://i-blog.csdnimg.cn/img_convert/1efcdad20f05490efc8a61d8916240ac.png)
DeepSeek:性能强劲的开源模型
deepseek 全新系列模型 DeepSeek-V3 首个版本上线并同步开源。登录官网 chat.deepseek.com 即可与最新版 V3 模型对话。 性能对齐海外领军闭源模型 DeepSeek-V3 为自研 MoE 模型,671B 参数,激活 37B,在 14.8T token 上进行了预训练。 论…...
![](https://i-blog.csdnimg.cn/img_convert/51fec787657dfcdd08333f8a596ba6e3.jpeg)
医疗可视化大屏 UI 设计新风向
智能化交互 借助人工智能与机器学习技术,实现更智能的交互功能。如通过语音指令或手势控制来操作大屏,医护人员无需手动输入,可更便捷地获取和处理信息。同时,系统能根据用户的操作习惯和数据分析,自动推荐相关的医疗…...
![](https://www.ngui.cc/images/no-images.jpg)
从企业级 RAG 到 AI Assistant , Elasticsearch AI 搜索技术实践
文章目录 01 AI 搜索落地的挑战02 Elasticsearch 向量性能 5 倍提升03 Elasticsearch 企业版 AI 能力全面解读04 阿里云 Elasticsearch 将准确率提升至 95%05 AI Assistant 集成通义千问大模型实现 AI Ops01 AI 搜索落地的挑战 在过去一年中,基座大模型技术的快速迭代推动了 …...
![](https://www.ngui.cc/images/no-images.jpg)
TypeScript语言的并发编程
TypeScript语言的并发编程 引言 随着现代应用程序的复杂性不断增加,性能和用户体验的重要性显得尤为突出。在这种背景下,并发编程应运而生,成为提升应用程序效率的重要手段。在JavaScript及其超集TypeScript中,尽管语言本身是单…...
![](https://i-blog.csdnimg.cn/direct/33a6b71ce4744674875cd5b85787191b.png)
benchANT 性能榜单技术解读 Part 1:写入吞吐
近期,国际权威数据库性能测试榜单 benchANT 更新了 Time Series: Devops(时序数据库)场景排名,KaiwuDB 数据库在 xsmall 和 small 两类规格下的时序数据写入吞吐、查询吞吐、查询延迟、成本效益等多项指标刷新榜单原有数据纪录。在…...
![](https://www.ngui.cc/images/no-images.jpg)
虚拟机防火墙管理
虚拟机防火墙管理 在网络防护方面,PVE提供了相当良好的防火墙管理功能,并且可以适用于节点实体机、客体机、让客体机内不需要另外再安装软体防火墙,对于效能与统一管理大有助益,管理者可以方便一次管理所有的防火墙规则࿰…...
![](https://i-blog.csdnimg.cn/direct/2665d77c25504269b23b89d1610620f9.png)
Nginx反向代理请求头有下划线_导致丢失问题处理
后端发来消息说前端已经发了但是后端没收到请求。 发现是下划线的都没收到,搜索之后发现nginx默认request的header中包含’_’时,会自动忽略掉。 解决方法是:在nginx里的nginx.conf配置文件中的http部分中添加如下配置: unders…...
![](https://i-blog.csdnimg.cn/blog_migrate/ed0afaffabc28cc474988b643d811f4e.png)
【STM32+CubeMX】 新建一个工程(STM32F407)
相关文章: 【HAL库】 STM32CubeMX 教程 1 --- 下载、安装 目录 第一部分、新建工程 第二部分、工程文件解释 第三部分、编译验证工程 友情约定:本系列的前五篇,为了方便新手玩家熟悉CubeMX、Keil的使用,会详细地截图每一步Cu…...
![](https://i-blog.csdnimg.cn/img_convert/277550ed4d31bb08365854aaa85264ba.png)
机器人避障不再“智障”:HEIGHT——拥挤复杂环境下机器人导航的新架构
导读: 由于环境中静态障碍物和动态障碍物的约束,机器人在密集且交互复杂的人群中导航,往往面临碰撞与延迟等安全与效率问题。举个简单的例子,商城和车站中的送餐机器人往往在人流量较大时就会停在原地无法运作,因为它不…...
![](https://i-blog.csdnimg.cn/direct/359b7058dc054f26b382684e41d66886.png)
H2数据库在单元测试中的应用
H2数据库特征 用比较简洁的话来介绍h2数据库,就是一款轻量级的内存数据库,支持标准的SQL语法和JDBC API,工业领域中,一般会使用h2来进行单元测试。 这里贴一下h2数据库的主要特征 Very fast database engineOpen sourceWritten…...
![](https://i-blog.csdnimg.cn/direct/6c7cdd4a03d648ec95b6151ad2583d0f.png)
部署HugeGraph
部署HugeGraph 这里以hugegraph1.2.0为例子,演示一下如何安装部署hugegraph 一、下载并安装JDK11 下载JDK11 https://www.oracle.com/java/technologies/downloads/#java11 使用scp命令将安装包上传到服务器 scp /path/to/local/file usernameserver_ip:/path/…...
![](https://www.ngui.cc/images/no-images.jpg)
2025年第三届“华数杯”国际赛A题解题思路与代码(Matlab版)
游泳竞技策略优化模型代码详解(MATLAB版) 第一题:速度优化模型 本部分使用MATLAB实现游泳运动员在不同距离比赛中的速度分配策略优化。 1. 模型概述 模型包含三个主要文件: speed_optimization.m: 核心优化类plot_speeds.m: …...
![](https://www.ngui.cc/images/no-images.jpg)
嵌入式基础 -- IMX8MP的 GPC 模块技术
General Power Controller (GPC) 模块技术文档 1. GPC 模块简介 1.1 模块功能 GPC(General Power Controller)模块是用于 i.MX8M Plus 应用处理器 的电源管理组件,支持以下功能: 管理 ARM Cortex-A53 和 Cortex-M7 平台的低功…...
![](https://i-blog.csdnimg.cn/direct/316a26a5e9e24c0bb4300f94915073d8.png)
选择器css
1.a标签选择 // 选中所具有herf 的元素 [herf] {color: skyblue; } // 选中所具有herfhttps://fanyi.youdao.com/ 的元素 [herf$"youdao.com"] {color:pink; } // 按此顺序书写 link visited hover active // 未访问状态 a:link {color:orange } // 访问状态 a…...
![](https://i-blog.csdnimg.cn/direct/f67f0e9f31d44799a8a562d6c7e45586.jpeg#pic_center)
全方位解读消息队列:原理、优势、实例与实践要点
全方位解读消息队列:原理、优势、实例与实践要点 一、消息队列基础认知 在数字化转型浪潮下,分布式系统架构愈发复杂,消息队列成为其中关键一环。不妨把消息队列想象成一个超级“信息驿站”,在古代,各地的信件、物资运…...
![](https://www.ngui.cc/images/no-images.jpg)
JavaScript运算符与控制结构
JavaScript作为一门强大的前端语言,提供了丰富的运算符与控制结构,使程序逻辑更加灵活与高效。 1. JavaScript运算符 算术运算符 运算符描述示例结果加法5 38-减法7 - 43*乘法2 * 612/除法8 / 24%取模(余数)10 % 31**幂运算3 …...
![](https://i-blog.csdnimg.cn/img_convert/7eb34b07504cd1e2a85dcd72d3d958fb.jpeg)
2030年中国AI人才缺口或达400万,近屿智能助力AI人才储备增长
在当今数字化浪潮下,人工智能(AI)已成为推动各行业发展的关键力量。然而,吸引和留住 AI 人才正成为全球性难题,中国亦不例外。据麦肯锡 2022 年全球人工智能商业高管调查,75% 的中国受访者在招聘数据科学家…...
![](https://i-blog.csdnimg.cn/direct/718e05914acd477cb7eb12fcceaf25bf.png#pic_center)
如何设计一个注册中心?以Zookeeper为例
这是小卷对分布式系统架构学习的第8篇文章,在写第2篇文章已经讲过服务发现了,现在就从组件工作原理入手,讲讲注册中心 以下是面试题: 某团面试官:你来说说怎么设计一个注册中心? 我:注册中心嘛&…...
![](https://i-blog.csdnimg.cn/direct/1117629404af4198a0834223cc769a7f.png)
ubuntu 20.04 安装docker--小白学习之路
更新包 sudo apt-get update # 安装需要的软件包以使apt能够通过HTTPS使用仓库 sudo apt-get install ca-certificates curl gnupg lsb-release 使用清华大学源 # 添加Docker官方的GPG密钥 curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg | sudo…...
![](/images/no-images.jpg)
锦州网站建设更好/百度推广注册
<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />美国思科公司(Cisco System Inc.)可谓无人不知,无人不晓。凭借它的IOS(Internet Operating System),Cisco公…...
![](http://upload-images.jianshu.io/upload_images/2085791-a3593714c18c3b1b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
做自己看视频的网站/免费域名服务器
2019独角兽企业重金招聘Python工程师标准>>> Fiori里的busy dialog有两种表现形式,一种是下图里的花朵形状,由5个不断旋转的花瓣组成。另一种是下图的3/4个圆环不断旋转的效果。 关于前者的效果,可以看我制作的这个视频。这个视频…...
![](/images/no-images.jpg)
太原网站定制/爱站权重
参考代码: import tensorflow as tf import os from tensorflow.python.framework import graph_util def set_config():#设置GPU使用率 # 控制使用率 os.environ[CUDA_VISIBLE_DEVICES] 0 # 假如有16GB的显存并使用其中的8GB: gpu_options tf.…...
展示型手机网站模板/资源搜索
• 描述使用ASM 的好处• 管理ASM 实例• 创建和删除ASM 磁盘组• 扩展ASM 磁盘组• 通过使用各种实用程序检索ASM 元数据Automatic Storage ManagementAutomatic Storage Management (ASM) 将文件系统与卷管理器纵向集成在一起,这是一项专门为Oracle DB 文件建立的…...
![](/images/no-images.jpg)
新公司网站建设流程/电子商务推广方式
依赖包安装 # 安装 myjs-common 包 npm install myjs-common1.0.0格式器表达式 YEAR_FORMAT: 年格式化-yyyyMONTH_FORMAT: 月格式化-yyyy-MMDATE_FORMAT: 日期格式化-yyyy-MM-ddHOUR_FORMAT: 时格式化-yyyy-MM-dd HHMINUTE_FORM…...
![](https://img-blog.csdnimg.cn/20190827194932791.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lpc2hhbmc0NA==,size_16,color_FFFFFF,t_70)
棋牌网站建设源码/做网站排名优化的公司
上一章中提到了VS的两个警告 不用说,这肯定是编码上的问题了。 一般来说,出现这个原因是,调用窗口类析构的时候,窗口还没有销毁。 常见的就是创建非模态对话框,附着在父对话框上显示的时候。 比如,我就是为CTabCtrl添加了两个子…...