在Spring Boot + MyBatis项目中实现MySQL读写分离

简介: 在Spring Boot和MyBatis项目中实现MySQL读写分离,主要有两种思路:一种是在应用层通过代码和配置手动控制,另一种是借助中间件自动路由。

Spring BootMyBatis项目中实现MySQL读写分离,主要有两种思路:一种是在应用层通过代码和配置手动控制,另一种是借助中间件自动路由。

下面是几种主流的实现方案,并提供一个基于Spring抽象路由数据源的实战指南。

🎯 如何选择实现方案

你可以根据项目的复杂度、团队的技术栈和运维能力,参考下表进行选择:

对于大多数Java开发者来说,从应用层手动分离开始学习是最直观的路径。

🔧 核心实现:应用层手动分离

这种方法的核心是利用Spring的 AbstractRoutingDataSource 来动态决定使用哪个数据源。

主要步骤

1、配置多个数据源

在你的application.yml文件中,分别配置主库和从库的连接信息。

spring:
  datasource:
    master:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://master-host:3306/db_name
      username: root
      password: master-pass
    slave:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://slave-host:3306/db_name
      username: root
      password: slave-pass

2、创建数据源上下文持有者

使用ThreadLocal来安全地存储和获取当前线程需要使用的数据源键值。

public class DataSourceContextHolder {
    private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
    
    public static void setDataSourceType(String dataSourceType) {
        CONTEXT_HOLDER.set(dataSourceType);
    }
    
    public static String getDataSourceType() {
        return CONTEXT_HOLDER.get();
    }
    
    public static void clearDataSourceType() {
        CONTEXT_HOLDER.remove();
    }
}

3、创建动态数据源类

继承AbstractRoutingDataSource并重写determineCurrentLookupKey方法,使其从上下文持有者中获取数据源键值。

public class DynamicDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDataSourceType();
    }
}

4、使用AOP自动切换数据源

通过切面,根据方法名或自定义注解自动设置数据源。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Master {
}

5、处理特殊情况:强制读主库

在某些需要实时读取数据的场景(如刚写入后立刻查询),你可以使用自定义注解来强制方法走主库。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Master {
}

然后在切面中增加对@Master注解的判断,优先使用主库。

⚠️ 实施中的关键问题与解决方案

主从延迟问题:这是读写分离架构中最常见的挑战。对于需要实时性保证的查询,可以使用上面提到的@Master注解强制走主库。

事务管理:为了确保数据一致性,在写操作(如@Transactional注解的方法)中,整个事务内的所有数据库操作都应使用主库。你可以在事务开始时就强制指定数据源为主库。

故障转移与监控:需要建立从库健康检查机制。当监测到从库延迟过大或宕机时,应能自动将读请求降级到主库,保证系统的可用性。

💎 总结

实现Spring Boot + MyBatis的读写分离,应用层手动方案适合快速上手和理解原理,而中间件方案则在动态扩展和运维管理上更有优势。

在学习或中小型项目中先从应用层方案入手,随着业务规模扩大,再平滑迁移到ProxySQL或ShardingSphere等更强大的中间件上。

在Spring Boot + MyBatis项目中实现MySQL读写分离.png

谢谢你看我的文章,既然看到这里了,如果觉得不错,随手点个赞、转发、在看三连吧,感谢感谢。那我们,下次再见。

您的一键三连,是我更新的最大动力,谢谢

山水有相逢,来日皆可期,谢谢阅读,我们再会

我手中的金箍棒,上能通天,下能探海

相关文章
|
2月前
|
存储 人工智能 安全
AICoding实践:从Prd到代码生成
本文探讨了在AI技术推动软件工程范式变革的新阶段,如何通过构建增强型AI编程系统(codefuse)实现从需求到代码的端到端自动生成。
889 21
AICoding实践:从Prd到代码生成
|
2月前
|
API 双11 数据安全/隐私保护
阿里云邮件推送简单易用、高效稳定的邮件群发服务介绍以及详细收费价格
阿里云邮件推送是基于云计算的高效邮件群发服务,支持事务通知、营销推广等场景,具备高并发、高到达率优势,历经双11考验。提供API接入,无需自建服务器。价格:5万封90元/6个月,50万封840元,100万封1590元,500万封7750元,适合中小企业批量发送需求。
189 5
|
2月前
|
搜索推荐 Java 关系型数据库
基于springboot的web图书借阅规划管理系统
本系统基于Web开发,采用SpringBoot+Vue架构,结合MySQL数据库与B/S模式,实现图书借阅全流程信息化管理。具备图书管理、用户服务、借阅统计、个性化推荐等功能,提升图书馆管理效率与读者体验,推动数字化转型。
|
2月前
|
数据采集 搜索推荐
《从数据到转化:游戏地域偏好驱动的精准推送指南》
本文聚焦游戏行业地域化精准推送的核心痛点,提出基于玩家地域偏好的差异化推送体系构建思路。文章从无干扰数据采集与伪偏好筛滤入手,通过三维立体数据模型获取真实需求,再从行为、审美、需求、付费四个维度拆解地域偏好,形成可量化标签。进而搭建“偏好-内容-场景-时段”动态联动机制,定制适配不同地区的推送内容与策略,并依托数据和玩家双轮反馈实现闭环迭代,同时规避过度标签化、静态思维等认知误区。这套方法打破“一刀切”运营模式,助力游戏实现全域用户的长效激活与留存。
105 1
|
2月前
|
运维 监控 前端开发
基于AI大模型的故障诊断与根因分析落地实现
本项目基于Dify平台构建多智能体协作的AIOps故障诊断系统,融合指标、日志、链路等多源数据,通过ReAct模式实现自动化根因分析(RCA),结合MCP工具调用与分层工作流,在钉钉/企业微信中以交互式报告辅助运维,显著降低MTTD/MTTR。
2208 28
|
2月前
|
人工智能 算法 搜索推荐
【经验分享】非技术岗小白的CAIE持证实录:从焦虑转型到技能变现,这些真心话只说给你听
先自报家门:汉语言文学专业,做了两年行政岗,每天被会议纪要、文件归档占满时间,看着身边人要么升职要么转去热门行业,焦虑到整夜失眠。偶然刷到AI岗位的招聘信息,薪资比我当时高一半,但“算法基础”“编程能力”这些要求直接把我劝退。直到发现CAIE注册人工智能工程师认证,说是不限制专业和基础,抱着“死马当活马医”的心态试了试,现在不仅顺利拿到一级证书,还成功转岗AI运营,薪资涨了30%。今天不搞虚的,把备考到持证的全流程干货和真心话都分享出来,希望能帮到和曾经的我一样迷茫的人。
|
2月前
|
存储 弹性计算 缓存
阿里云云服务器经济型、通用算力型和第九代热门实例解析:实例性能、适用场景与选购参考
在阿里云目前的活动中,可选的云服务器ECS实例规格主要有经济型e、通用算力型u1/u2i/u2a、九代c9i/g9i/r9i/c9a/g9a/r9a实例等。不同实例规格的所采用的架构、处理器不同,因此在计算、网络、存储等方面的性能也有所不同,从而在适用场景方面也有所差异。本文为大家解析这些实例各自的性能与适用场景,为企业及个人用户提供一份选择参考指南。
|
2月前
|
Python
NPP 热带森林:巴拿马达连,1967-1968 年,R1
本数据集记录1967–1968年巴拿马达连热带森林的净初级生产力(NPP),涵盖地上/地下生物量、凋落物、叶面积指数及土壤养分,反映雨季与旱季样地差异。无气候数据。两样地具代表性,ANPP最低估值为1137克/平方米/年,LAI分别为22.4与10.6。
55 7
|
2月前
|
机器学习/深度学习 人工智能 供应链
数据分析专员:当传统汽车销售融入AI智能,如何驱动业绩新增长
在汽车销售行业竞争激烈的今天,数据价值已成为企业决策的核心资产。近日,泉州中元名车汇汽车有限公司发布了一个“数据分析专员”的岗位招聘信息,这看似是一个传统的数据处理职位,但其中“持有CAIE认证者优先”的要求,却悄然揭示了一个重要趋势:在传统行业中,数据分析岗位正在被重新定义,AI能力已成为提升业务价值的加速器。这个新的岗位,为我们观察AI如何赋能传统行业一线业务提供了一个生动案例。
|
4月前
|
监控 Java Spring
AOP 切面编程
AOP(面向切面编程)通过动态代理在不修改源码的前提下,对方法进行增强。核心概念包括连接点、通知、切入点、切面和目标对象。常用于日志记录、权限校验、性能监控等场景,结合Spring AOP与@Aspect、@Pointcut等注解,实现灵活的横切逻辑管理。
747 6
AOP 切面编程

热门文章

最新文章