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

目录

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.xdnf.cn/news/1424966.html

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

相关文章

Cadence 16.6 PCB Edito如何将鼠标中键反向拉拽改为正向拖拽

Cadence 16.6 PCB Editor如何将鼠标中键反向拉拽改为正向拖拽 Cadence 16.6 PCB Editor默认鼠标中键是反向的拉拽&#xff0c;让我很不适应&#xff0c;在网上找的可行的方法&#xff0c;在这里总结出来&#xff0c;希望能帮到其他工程师。 按照以下步骤进行操作&#xff1a; …

数字化智能:Web3时代的物联网创新之路

引言 随着科技的不断发展&#xff0c;物联网&#xff08;IoT&#xff09;技术正在迅速普及和应用。而随着Web3时代的到来&#xff0c;物联网将迎来新的发展机遇和挑战。本文将探讨Web3时代的物联网创新之路&#xff0c;深入分析其核心技术、应用场景以及未来发展趋势。 Web3时…

4.线性代数

深度学习作为一门前沿的、应用广泛的学科&#xff0c;对于数学基础的要求非常高。 线性代数 线性代数在深度学习中扮演着至关重要的角色。它不仅是描述和理解数据的基础工具&#xff0c;也是构建和训练神经网络的核心组件。例如&#xff0c;在深度学习中&#xff0c;我们经常…

RAW转换和图像编辑工具:Capture One 23 Pro (win/mac)中文专业版

Capture One 23是一款功能强大的桌面版照片编辑软件&#xff0c;由丹麦PHASE ONE飞思数码公司开发。 以下是该软件的一些主要特点&#xff1a; 强大的RAW处理功能&#xff1a;Capture One 23支持多种品牌的相机和镜头&#xff0c;提供了丰富的RAW处理工具&#xff0c;包括曝光、…

【Python】图像批量合成视频,并以文件夹名称命名合成的视频

一个文件夹中有多个子文件夹&#xff0c;子文件夹中有多张图像。如何把批量把子文件夹中的图像合成视频&#xff0c;视频名称是子文件夹的名称&#xff0c;生成的视频保存到指定文件夹&#xff0c;效果记录。 代码 import os import cv2def create_video_from_images(image_f…

linux中远程服务器上传输文件的10个sftp命令示例

目录 1. 如何连接到 SFTP 2. 帮助 3.检查当前工作目录 4. 使用 sftp 列出文件 远程 本地 5. 使用 sftp 上传文件 6. 使用 sftp 上传多个文件 7. 使用 sftp 下载文件 8. 在 sftp 中切换目录 远程 本地 9. 使用 sftp 创建目录 10. 使用 sftp 删除目录 11. 退出 sf…

一次tomcat闪退处理

双击tomcat目录下bin目录中startup.bat 在我的电脑上是一闪而过&#xff0c;不能正常地启动tomcat软件 以记事本打开startup.bat文件&#xff0c;在文件的结尾处加上pause 然后再双击该bat执行&#xff0c;此时窗口就不会关闭&#xff0c;并会将错误信息打印在提示框中 可能是…

skimage图像处理(五)

多数量图像处理&#xff08;批量化处理&#xff09; 多数量图片内读取指定图片 首先导入skimage.io模块并将其简称为io&#xff0c;导入skimage库中的data_dir模块&#xff0c;用于获取示例图像的目录路径 import skimage.io as io from skimage import data_dir 构建…

Spring Boot 自动配置-响应式编程-022

🤗 ApiHug {Postman|Swagger|Api...} = 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱,有温度,有质量,有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace The Next Generation API Development Platform…

海狐外卖多商户O2O商城系统前端技术实现与探索

摘要&#xff1a; 随着外卖市场的快速发展&#xff0c;多商户O2O商城系统成为餐饮行业数字化转型的重要工具。本文基于海狐外卖多商户O2O商城系统的前端技术实现&#xff0c;探讨了前端技术在高并发、多端适配、自定义装修等方面的应用与挑战&#xff0c;并分享了系统前端架构…

IT行业现状与探索未来发展趋势

​​​​​​​ 我眼中的IT行业现状与未来趋势 随着技术的不断进步&#xff0c;IT行业已成为推动全球经济和社会发展的关键力量。从云计算、大数据、人工智能到物联网、5G通信和区块链&#xff0c;这些技术正在重塑我们的生活和工作方式。你眼中IT行业的现状及未来发展趋势是…

综合性练习-验证码

1. 验证码案例 随着安全性的要求越来越高,目前项目中很多都使用了验证码,验证码的形式也是多种多样,更复杂的图形验证码和⾏为验证码已经成为了更流⾏的趋势. 2. 需求 界面如下图所示 1. 页面生成验证码 2. 输入验证码,点击提交,验证用户输入验证码是否正确,正确则进行页面跳…

MySQL第一次作业(基本操作)

目录 一、登陆数据库 二、创建数据库zoo 三、修改数据库zoo字符集为gbk 四、选择当前数据库为zoo 五、查看创建数据库zoo信息 六、删除数据库zoo 一、登陆数据库 指令&#xff1a; mysql -u root -p 二、创建数据库zoo 指令&#xff1a; create database zoo; 三、修改数…

2024新零售行业多元化用工报告

来源&#xff1a;君润人力 近期历史回顾&#xff1a;

Springboot开发 -- Postman 调试 session 验证 接口

当我们在开发Spring Boot应用时&#xff0c;经常会遇到带有Session验证的接口&#xff0c;这些接口需要用户先登录并获取到Session ID&#xff08;或称为cookie中的JSESSIONID&#xff09;&#xff0c;然后在后续的请求中携带这个Session ID来保持会话状态。下面我将以一个实际…

STM32 FSMC接口控制SRAM(芯片型号:IS61WV102416BLL)

目录 概述 1 硬件介绍 1.1 SRAM的电路 1.2 IS61WV102416ALL芯片 2 STM32Cube配置工程 2.1 配置FSMC 2.2 其他参数配置 2.3 生成工程 3 SRAM的功能验证 3.1 编写测试函数 3.1.1 写数据函数 3.1.2 读数据函数 3.2 完整代码 4 测试 测试代码下载地址&#xff1a; s…

代码随想录——二叉树的最大深度(Leetcode104)

题目链接 层序遍历 当遍历到二叉树每一层最后一个节点时&#xff0c;depth /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* …

UART 16550 IP核使用详解

AXI UART 16550是Xilinx FPGA中提供的一个UART IP核&#xff0c;它允许通过AXI接口与UART设备进行通信。本文描述了如何使用Xilinx的Vivado Design Suite环境中的工具来定制和生成 UART 16550 IP核&#xff0c;以及如何配置和使用该IP核。 1 UART 16550 IP核的使用 以下是针对…

【算法】网络图中的dfs

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、单词搜索二、黄金矿工三、不同路径 |||四、图像渲染五、岛屿数量六、岛屿的最大面积七、被围绕的区域…

SSD与HDD仍然共存,并将长期共存!

在技术快速迭代的今天&#xff0c;固态硬盘&#xff08;SSD&#xff09;与传统硬盘&#xff08;HDD&#xff09;之间的竞争一直是存储领域的一大焦点。 扩展阅读&#xff1a; HDD回暖于2024&#xff0c;与SSD决战于2028 HDD的烦恼&#xff1a;HAMR会让SMR黯然失色吗&#xff…