Spring实现数据库读写分离(MySQL实现主从复制)

news2025/1/24 2:09:50

目录

1、背景

2、方案

2.1 应用层解决:

2.2 中间件解决

3、使用Spring基于应用层实现

3.1 原理

3.2 DynamicDataSource

3.3 DynamicDataSourceHolder

3.4 DataSourceAspect

3.5 配置2个数据源

3.5.1 jdbc.properties

3.5.2 定义连接池

3.5.2 定义DataSource

3.6 配置事务管理以及动态切换数据源切面

3.6.1 定义事务管理器

3.6.2 定义事务策略

3.6.3 定义切面

4、改进切面实现,使用事务策略规则匹配

4.1 改进后的配置

4.2 改进后的实现

5、一主多从的实现

5.1 实现

6、MySQL主从复制

6.1 原理

6.2 主从配置需要注意的地方

6.3 主库配置(windows,Linux下也类似)

6.4 在主库创建同步用户

6.5 从库配置


1、背景

        我们一般应用对数据库而言都是“读多写少”,也就说对数据库读取数据的压力比较大,有一个思路就是说采用数据库集群的方案,

        其中一个是主库,负责写入数据,我们称之为:写库;

        其它都是从库,负责读取数据,我们称之为:读库;

那么,对我们的要求是:

  1. 读库和写库的数据一致;
  2. 写数据必须写到写库;
  3. 读数据必须到读库;

2、方案

        解决读写分离的方案有两种:应用层解决和中间件解决。

2.1 应用层解决:

优点:

  1. 多数据源切换方便,由程序自动完成;
  2. 不需要引入中间件;
  3. 理论上支持任何数据库;

缺点:

  1. 由程序员完成,运维参与不到;
  2. 不能做到动态增加数据源;

2.2 中间件解决

优缺点:

优点:

  1. 源程序不需要做任何改动就可以实现读写分离;
  2. 动态添加数据源不需要重启程序;

缺点:

  1. 程序依赖于中间件,会导致切换数据库变得困难;
  2. 由中间件做了中转代理,性能有所下降;

相关中间件产品使用:

        mysql-proxy:如流,新一代智能工作平台

Amoeba for MySQL:Amoeba for mysql 0.31发布(读写分离、负载均衡、Failover、数据切分) - 企业应用 - Java - ITeye论坛和Mysql 基于 Amoeba 的 读写分离 - MySQL,数据库 - Tech - ITeye论坛

3、使用Spring基于应用层实现

3.1 原理

        在进入Service之前,使用AOP来做出判断,是使用写库还是读库,判断依据可以根据方法名判断,比如说以query、find、get等开头的就走读库,其他的走写库。

3.2 DynamicDataSource

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

/**

 * 定义动态数据源,实现通过集成Spring提供的AbstractRoutingDataSource,只需要实现determineCurrentLookupKey方法即可

 * 由于DynamicDataSource是单例的,线程不安全的,所以采用ThreadLocal保证线程安全,由DynamicDataSourceHolder完成。

*/

public class DynamicDataSource extends AbstractRoutingDataSource{

    @Override

    protected Object determineCurrentLookupKey() {

        // 使用DynamicDataSourceHolder保证线程安全,并且得到当前线程中的数据源key

        return DynamicDataSourceHolder.getDataSourceKey();

    }

}

3.3 DynamicDataSourceHolder

/**

 * 使用ThreadLocal技术来记录当前线程中的数据源的key

*/

public class DynamicDataSourceHolder {

   

    //写库对应的数据源key

    private static final String MASTER = "master";

    //读库对应的数据源key

    private static final String SLAVE = "slave";

   

    //使用ThreadLocal记录当前线程的数据源key

    private static final ThreadLocal<String> holder = new ThreadLocal<String>();

    /**

     * 设置数据源key

     * @param key

     */

    public static void putDataSourceKey(String key) {

        holder.set(key);

    }

    /**

     * 获取数据源key

     * @return

     */

    public static String getDataSourceKey() {

        return holder.get();

    }

   

    /**

     * 标记写库

     */

    public static void markMaster(){

        putDataSourceKey(MASTER);

    }

   

    /**

     * 标记读库

     */

    public static void markSlave(){

        putDataSourceKey(SLAVE);

    }

}

3.4 DataSourceAspect

import org.apache.commons.lang3.StringUtils;

import org.aspectj.lang.JoinPoint;

/**

 * 定义数据源的AOP切面,通过该Service的方法名判断是应该走读库还是写库

*/

public class DataSourceAspect {

    /**

     * 在进入Service方法之前执行

     *

     * @param point 切面对象

     */

    public void before(JoinPoint point) {

        // 获取到当前执行的方法名

        String methodName =

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1681310.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业微信hook接口协议,ipad协议http,大文件网络上传

大文件网络上传 参数名必选类型说明url是String网络图片地址 请求示例 {"uuid":"2b0863724106a1160212bd1ccf025295","authkey":"0AAxxx031", "filekey":"346b7bff-08d5-4ac2-bc67-fd10e3eb2388", "fileur…

恒创科技:域名CNAME解析和A记录解析有哪些区别?

​  域名是互联网上的一种地址&#xff0c;是用以替代复杂IP地址的字符标识&#xff0c;在进行域名解析时&#xff0c;主要有两种常见的记录类型&#xff1a;CNAME 记录和 A记录解析。今天就给大家讲下CNAME解析和A记录解析有哪些区别、优势。这里&#xff0c;我们先了解下什…

2024年代理!武汉重点实验室申报条件、奖励补贴

2024年武汉重点实验室申报条件、奖励补贴的想想内容整理如下&#xff0c;江岸区、江汉区、硚口区、汉阳区、武昌区、青山区、洪山区、蔡甸区、江夏区、黄陂区、新洲区、东西湖区、汉南区、武汉经开区、东湖高新区企业申报重点实验室有不明白的可了解&#xff1a; 武汉重点实验室…

【Leetcode每日一题】 综合练习 - 括号生成(难度⭐⭐)(76)

1. 题目解析 题目链接&#xff1a;22. 括号生成 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 问题描述 我们需要找出所有可能的、有效的括号序列。一个有效的括号序列指的是一个仅由(和)组成的字符串&#xff0c;…

高效协同,智慧绘制:革新型流程图工具全解析

流程图&#xff0c;作为一种直观展示工作过程和系统运作的工具&#xff0c;在现代办公和项目管理中发挥着不可或缺的作用。 其优势在于能够清晰、直观地呈现复杂的过程和关系&#xff0c;帮助人们快速理解并掌握关键信息。同时&#xff0c;流程图也广泛应用于各种场景&#xf…

C++ static_cast学习

static_cast可实现&#xff0c; 1 基本类型之间的转换 2 void指针转换为任意基本类型的指针 3 用于有继承关系的子类与父类之间的指针或引用的转换 用于基本类型转化时&#xff0c;会损失精度类似于C语言的强制转化&#xff1b; 下面先看一下void指针的转换&#xff1b; …

cpu卡片详解(FM1208)

​ 目录 ​1. 引言 1.1 FM1208 CPU卡芯片 2. FM1208 CPU卡芯片概述 2.1 FM1208及其在智能卡中的作用 2.2 FM1208功能框图 3.FM1208的技术规格 4.FM1208工作流程 5.&#xff26;&#xff2d;1208文件结构 6.FM1208与其他智能卡技术的比较 7.FM1208安全特性 7.1 DES/…

哈希表法快速求解最长连续序列 | 力扣128题详细解析

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

美团小程序mtgsig1.2逆向

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018601872 本文章未…

HarmonyOS ArkTS 实现类似Android中RadioButton得效果

在Android中如实现下图可以用radioGroup和RadioButton实现&#xff0c;但在ArkTs中radio不能实现自定义样式&#xff0c;所以用Tabs来实现这种效果&#xff0c;效果图如下&#xff1a; 一、效果图 二、实现横向布局的三个TabContent&#xff0c;代码如下 State currentIndex: n…

互联网轻量级框架整合之控制反转和注入

依赖注入和依赖查找 应该说IoC的工作方式有两种&#xff0c;一种是依赖查找&#xff0c;通过资源定位&#xff0c;把对应的资源查找出来&#xff0c;例如通过JNDI找到数据源&#xff0c;依赖查找被广泛使用在第三方的资源注入上&#xff0c;比如在Web项目中&#xff0c;数据源往…

小程序|锁定查询功能如何使用?

学生或家长想要实现自己查询完成后&#xff0c;任何人都无法再次查询&#xff0c;老师应该如何设置&#xff1f;易查分的【锁定查询功能】就可实现&#xff0c;下面教大家如何使用吧。 &#x1f4cc;使用教程 &#x1f512;锁定查询功能介绍 ✅学生或家长自主锁定&#xff1a;开…

酷开科技丨女性群像大戏《惜花芷》在酷开系统热播中

在这个国产剧市场蓬勃发展的时代&#xff0c;酷开科技通过其生态智能电视系统&#xff0c;为剧迷们打造了一个精彩的观剧平台。通过酷开科技的智能推荐算法&#xff0c;消费者能够轻松地发掘并观看各种题材的高质量剧集&#xff0c;无论是扣人心弦的金融较量、深刻的家庭代际关…

QCustomPlot的了解

&#xff08;一&#xff09;QCustomPlot常见属性设置、多曲线绘制、动态曲线绘制、生成游标、矩形放大等功能实现-CSDN博客 关键代码&#xff1a; QT core gui printsupport 使用上面文章中的代码跑起来的程序效果图&#xff1a; 我的学习过程&#xff1a; 最开始初…

位图和布隆过滤器:位图

在《unordered_map 和 unordered_set》 中提到过&#xff1a; 哈希是一种思想&#xff0c;通过哈希函数将数据转化为一个或多个整型 —— 映射关系&#xff1b;通过这种映射关系&#xff0c;可以做到以 O(1) 的时间复杂度查找数据。 本文即将介绍的 位图 和 布隆过滤器 就是两个…

【漏洞复现】泛微OA E-Cology GetLabelByModule SQL注入漏洞

漏洞描述&#xff1a; 泛微OA E-Cology是一款面向中大型组织的数字化办公产品&#xff0c;它基于全新的设计理念和管理思想&#xff0c;旨在为中大型组织创建一个全新的高效协同办公环境。泛微OA E-Cology getLabelByModule存在SQL注入漏洞&#xff0c;允许攻击者非法访问和操…

ubuntu下安装pwndbg

安装pwndbg 如果可以科学上网 首先安装git apt install git 然后拉取git库 git clone GitHub - pwndbg/pwndbg: Exploit Development and Reverse Engineering with GDB Made Easy 进入到pwngdb的文件夹中 cd pwngdb 执行 ./setup.sh 而后输入gdb 出现红色pwndgb就是安装成功…

图形程序复用新纪元 探讨云库安全分享计划

在公司的开放式办公室中&#xff0c;卧龙与凤雏相邻而坐。周围的同事们都在忙碌地工作&#xff0c;键盘敲击声不绝于耳。卧龙眉头紧锁&#xff0c;全神贯注地调试着复杂的代码&#xff0c;仿佛在挑战编程世界的极限。而凤雏则在完成了一段代码编写后&#xff0c;轻松地伸展着身…

EtherCat:打通EtherCat奇经八脉(一)

一、EtherCat背景介绍 EtherCAT是一种用于实时以太网通信的现场总线协议。它由德国Beckhoff公司于2003年开发&#xff0c;并在2014年成为国际电机工程师协会&#xff08;IEC&#xff09;的国际标准&#xff08;IEC61158-12&#xff09;。 EtherCAT的设计目标是实现高性能的实时…

【独家发布】公司搭建绩效考核体系的方案(一)

某车辆公司成立于上世纪七十年代&#xff0c;其悠久历史可以追溯到洋务运动时期&#xff0c;曾开创了中国近代工业的先河。该公司拥有近五十年的车辆生产经验及积累&#xff0c;全球共有13个生产基地&#xff0c;22个整车发动机工厂和3个独立变速器工厂&#xff0c;1个技术中心…