数据库读写分离分案

news2024/9/23 20:03:35

环境:MySQL主从数据库。如需要搭建可参考上一篇文章:MySQL主从数据库简单搭建

数据库使用主从可确保数据一致性,示例是基于一个完整的项目之上做了一些修改,为测试效果直接连接了两个非主从配置的数据库,其中只有测试的数据表内容不同其余内容全部相同。

方案参考:MySQL读写分离的三种实现方案

一、应用层(动态数据源切换)实现

优点: 1、不需要引入中间件; 2、 理论上支持任何数据库;
缺点: 1、侵入性强; 2、 根据具体的 Service 方法是否会操作数据,注入不同的数据源;

1、引入动态数据源依赖

<dependency>
	  <groupId>com.baomidou</groupId>
      <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
      <version>2.5.5</version>
</dependency>

2、配置文件修改

spring:
  datasource:
    dynamic:
      primary: master
      strict: false
      datasource:
        master:
          type: com.alibaba.druid.pool.DruidDataSource
          url: jdbc:mysql://192.168.100.205:3306/mydb?serverTimezone=GMT&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
          username: root
          password: '123456'
          driver-class-name: com.mysql.cj.jdbc.Driver
          initial-size: 5 # 初始连接数
          max-active: 50 # 最大连接数
          min-idle: 5 # 最小空闲连接数
          validation-query: SELECT 1 # 验证连接是否有效的 SQL 查询语句
          test-while-idle: true # 空闲时验证连接是否有效
          test-on-borrow: false # 获取连接时验证连接是否有效
          test-on-return: false # 归还连接时验证连接是否有效
          time-between-eviction-runs-millis: 60000 # 连接回收的时间间隔
          min-evictable-idle-time-millis: 300000 # 连接在池中最小生存的时间
        slave_1:
          type: com.alibaba.druid.pool.DruidDataSource
          url: jdbc:mysql://192.168.100.5:3306/mydb?serverTimezone=GMT&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
          username: root
          password: '123456'
          driver-class-name: com.mysql.cj.jdbc.Driver
          initial-size: 5
          max-active: 50
          min-idle: 5
          validation-query: SELECT 1
          test-while-idle: true
          test-on-borrow: false
          test-on-return: false
          time-between-eviction-runs-millis: 60000
          min-evictable-idle-time-millis: 300000

3、ServiceImpl相关实现中添加注解,指定切换从数据库

@Override
public void getById() {
	userMapper.getCount();
}

@DS("slave")
@Override
public void getById2() {
	userMapper.getCount2();
}

由于在数据源中配置了primary: master,默认操作都会从主库执行,使用注解@DS切换数据源,此注解也可直接用于类文件上,同时存在方法注解优先于类上注解。

4、测试验证

两个方法的查询语句一样,但设置两个测试数据库查询的表的内容有所不同,如果能查出对应的值说明读写分离成功。
项目启动成功会打印日志:
项目启动成功打印日志

5、遇到问题

项目启动失败
1、如果启动失败,可能是由于修改数据库配置,部分配置文件不匹配,需要注释掉。
比如示例项目中有未修改之前的配置类。数据库配置类
2、SpringBoot 启动时自动配置数据库信息导致启动失败,项目启动类添加注解。

@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)

因为 DruidDataSourceAutoConfigure 在 DynamicDataSourceAutoConfiguration 之前会注入一个 DataSourceWrapper,会在原生的 spring.datasource 下找 url,username,password 信息,在启动类上排除掉自动配置类即可。
项目启动补充注解

二、ShardingSphere-jdbc 实现

优点: 1、做SQL解析,自动实现读写分离; 2、 将事务都管理起来;
缺点: 1、存在侵入性(需要配置在代码中);

ShardingSphere参考文档:ShardingSphere 文档
ShardingSphere源码:ShardingSphere源码

1、引入ShardingSphere的Jar包依赖

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>4.0.0-RC1</version>
</dependency>

2、配置文件修改

spring:
  shardingsphere:
    # 数据源相关配置
    datasource:
      # 数据源名称
      names: master,s1
      # MySQL master数据源
      master:
        # 数据库连接池
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://192.168.100.205:3306/shardingsphere_demo?serverTimezone=GMT&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
        username: root
        password: 123456
      # slave数据源
      s1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://192.168.100.5:3306/shardingsphere_demo?serverTimezone=GMT&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
        username: root
        password: 123456
    masterslave:
      load-balance-algorithm-type: round_robin
      name: ms
      master-data-source-name: master
      slave-data-source-names: s1

    # 其他属性
    props:
      # 开启SQL显示
      sql.show: true

3、测试验证

写好测试代码,简单的数据库操作查询、新增即可,主要是为了测试查询走从库,对数据库操作走主库。

启动成功,控制台会打印初始化了两个数据库:
启动成功控制台输出执行查询时,控制台输出:
在这里插入图片描述执行新增时,控制台输出:
在这里插入图片描述

4、遇到问题

1、如果是在原有项目上改数据库配置,记得将nacos中原有数据库相关配置注释掉,原有项目中数据库配置类相关内容也要注释掉。

2、最初使用的是 4.1.1 版本,启动服务总是报错启动失败。
pom依赖

Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
	at org.springframework.util.Assert.notNull(Assert.java:201)
	at org.mybatis.spring.support.SqlSessionDaoSupport.checkDaoConfig(SqlSessionDaoSupport.java:122)
	at org.mybatis.spring.mapper.MapperFactoryBean.checkDaoConfig(MapperFactoryBean.java:73)
	at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800)
	... 49 common frames omitted

上网找解决方案,最终处理是将版本降低了。
pom依赖
版本降低之后启动还有报错,根据报错信息又加了一个配置,最终启动成功。

spring:
  main:
    allow-bean-definition-overriding: true

参考推荐:【MySQL系列】真香!基于ShardingSphere-JDBC的MySQL读写分离

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

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

相关文章

Linux cp、mv命令显示进度条

1.advcpmv 平常使用cp 拷贝大文件时&#xff0c;看不到多久可以完成&#xff0c;虽然加上-v参数也只能看到正在拷贝文件&#xff0c;那就使用以下方法实现 git clone https://github.com/jarun/advcpmv.git cd advcpmv/ bash install.shmv ./advcp /usr/local/bin/ mv ./advmv …

Vite+Vue3+TS+Vue-Router+Axios+Pinia开发模板

一、模板介绍 VUE3开发全家桶模板&#xff0c;安装了ts,router,axios,pinia并提供了简单示例并提供了它们的官网链接。 对axios进行了简单封装。 二、下载地址 https://github.com/yigedayouzi/ViteTemplateOne 三、快速开始 1、git clone gitgithub.com:yigedayouzi/Vite…

备忘录导出的HTML文档转换MarkDown尝试记录

备忘录导出的HTML文档转换MarkDown尝试记录 1. pandoc命令行2. HTML转换MARKDOWN3. MD导入CSDN记录过长报错及压缩尝试参考 本地备忘录写了些旅游攻略&#xff0c;想做个纪念&#xff0c;导出为长图片ok&#xff0c;导出为HTML&#xff0c;也可以。但是导出图片是base64格式的&…

VMware Live Site Recovery 9.0 - 数据中心灾难恢复 (DR)

VMware Live Site Recovery 9.0 - 数据中心灾难恢复 (DR) VMware Site Recovery Manager, VMware SRM 现已更名为 VMware Live Site Recovery 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-live-site-recovery-9/&#xff0c;查看最新版。原创作品&#xff0c;转…

控价其实是对品牌市场的保护

品牌发展过程中&#xff0c;如果有越来越多的经销商加入&#xff0c;必然要做好控价&#xff0c;否则渠道的混乱&#xff0c;会使得品牌价值受损&#xff0c;比如低价的出现&#xff0c;会影响正规经销商的出货&#xff0c;使其竞争力增加&#xff0c;同时价格的不稳定会连带产…

【框架】说一说 Fork/Join?

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;学习Java框架 个性签名&#xff1a;人生乏味啊&#xff0c;我欲令之光怪陆离 本文封面由 凯楠&#x1f4f7; 友情赞助 目录 前言 什么是 Fork&#xff1f; 什么是 Join&#xff1f; Fork/Join 的核心组件 F…

用友 GRP-U8 sqcxIndex SQL 注入漏洞

产品简介 用友GRP-U8R10行政事业内控管理软件是用友公司专注于国家电子政务事业&#xff0c;基于云计算技术所推出的新一代产品&#xff0c;是我国行政事业财务领域最专业的政府财务管理软件。 漏洞描述 用友GRP-U8 sqcxIndex.jsp接口存在SQL注入漏洞&#xff0c;未经身份认…

AWTK T9 输入法实现原理

1. T9 输入法的中文字典数据 网上可以找到 T9 输入法的中文字典数据&#xff0c;但是通常有两个问题&#xff1a; 采用 GPL 协议&#xff0c;不太适合加入 AWTK。 只支持单个汉字的输入&#xff0c;不支持词组的输入。 经过考虑之后&#xff0c;决定自己生成 T9 输入法的中…

2024,淘天六大升级,电商人都准备好了吗?|淘天商品数据采集商品订单接口

淘天各类商品API接口 许多商家一直在问&#xff0c;到了2024年&#xff0c;淘天到底有哪些新改变&#xff1f;商家们又该如何做优化、调整&#xff1f; 我们总结来看&#xff0c;主要在六个方面进行了升级。 第一个是流量获取的逻辑变了。 从曾经的单一的流量入口&#xff0c;…

Leetcode——560. 和为 K 的子数组

560. 和为 K 的子数组 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/subarray-sum-equals-k/description/ 题目描述&#xff1a; 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回该数组中和为 k 的子数组的个数 。子数组是数组中元素…

Ubuntu学习笔记之Shell与APT下载工具

基本都是摘抄正点原子的文章&#xff1a;<领航者 ZYNQ 之嵌入式Linux 开发指南 V3.2.pdf&#xff0c;因初次学习&#xff0c;仅作学习摘录之用&#xff0c;有不懂之处后续会继续更新~ 一、Ubuntu Shell操作 简单的说Shell 就是敲命令。国内把 Linux 下通过命令行输入命令叫…

福昕阅读器 PDF 文档基本操作

福昕阅读器 PDF 文档基本操作 References 转至 PDF 顶部 快捷键&#xff1a;Home. 转至 PDF 顶部 快捷键&#xff1a;End. 打开超链接 文本选择工具 -> 手形工具 (Hand Tool) -> 点击超链接 福昕阅读器 同时在多个窗口中打开多个文件 文件 -> 偏好设置 -> 文…

Autosar-WdgM配置详解(免费)-2

1.4生成Wdg模块以及代码 按以下步骤生成WdgM模块代码&#xff1a; 工具如果成功生成的话&#xff0c;会在COmponnets下面创建一个WdgM的SWC&#xff0c;如下图: 1.5创建SWC模块 WdgM已经提供了deadline的port&#xff0c;接下来就是需要SWC使用WdgM的port。 1.5.1创建Master…

目标检测中的mAP计算原理和源码实现

简介 在目标检测任务中&#xff0c;mAP&#xff08;mean Average Precision&#xff0c;平均精度均值&#xff09;是一个非常重要的评价指标&#xff0c;用于衡量模型在多个类别上的平均性能。它综合考虑了模型在不同召回率下的精确率&#xff0c;能够全面反映模型在检测任务中…

Python从0到100(七):Python列表介绍及运用

一、 列表概述 问题描述&#xff1a; 假设一个班有100个学生&#xff0c;如果每个变量存放一个学生的姓名&#xff0c;是不是很麻烦&#xff1f;如果有一千个学生甚至更多&#xff0c;那该怎么办呢&#xff1f; 列表是Python中的一种数据结构&#xff0c;它可以存储不同类型的…

冰蓄冷空调的工作原理介绍

冰蓄冷空调(Ice Storage Air Conditioning System)是一种利用夜间电力低谷时段储存冷量,白天用电高峰时段释放冷量的空调技术。 这种技术通过在电网负荷低谷时(如深夜)运行制冷设备,将电能转化为冷量储存在冰块或者冷冻水中,然后在白天电网负荷高峰时,将储存的冷量释放…

电脑怎么卸载软件?分享3个正确操作方法!

“我电脑上下载了很多的软件&#xff0c;这些软件很多我都不需要了&#xff0c;有什么方法可以安全卸载它们吗&#xff1f;” 随着我们使用电脑的时间越来越长&#xff0c;安装的软件也越来越多。但有时候&#xff0c;我们会因为某些原因需要卸载一些软件&#xff0c;以释放硬盘…

美团offer啦

我爱团子&#xff0c;真得叫团爹吧&#xff01; 3.16笔试 3.19一面 3.20二面➕oc 3.21 offer 只能说进度有点太快了&#xff0c;直接开摆吧&#xff0c;终于可以歇一歇了。 把好运传给大家&#xff0c;祝大家都能找到心仪的offer。 #美团# 作者&#xff1a;洛杉矶快船保罗乔治

javaSwing宿舍管理系统(三个角色)

一、 简介 宿舍管理系统是一个针对学校宿舍管理的软件系统&#xff0c;旨在方便学生、宿管和管理员进行宿舍信息管理、学生信息管理以及宿舍评比等操作。该系统使用 Java Swing 进行界面设计&#xff0c;分为三个角色&#xff1a;管理员、宿管和学生。 二、 功能模块 2.1 管…

STM32微控制器的中断优先级设置中,抢占优先级和子优先级如何影响中断响应?

在STM32微控制器中&#xff0c;中断优先级设置是一个关键的概念&#xff0c;它决定了在发生多个中断时&#xff0c;哪些中断能够优先被处理。STM32的中断优先级系统包括抢占优先级&#xff08;Preemption Priority&#xff09;和子优先级&#xff08;Subpriority&#xff09;&a…