【数据库】使用ShardingSphere+Mybatis-Plus实现读写分离

news2024/11/19 20:40:03

书接上回:数据库调优方案中数据库主从复制,如何实现读写分离

ShardingSphere 实现读写分离的方式是通过配置数据源的方式,使得应用程序可以在执行读操作和写操作时分别访问不同的数据库实例。这样可以将读取操作分发到多个从库(从服务器),从而提高读取性能,同时将写操作发送到主库(主服务器)以确保数据的一致性。

引入依赖

		<dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
            <version>5.1.1</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
             <groupId>com.mysql</groupId>
             <artifactId>mysql-connector-j</artifactId>
             <version>${mysql-version}</version>
         </dependency>

配置

# 读写分离配置
spring:
  shardingsphere:
    datasource:
      # 配置真实数据源
      names: master,slave1,slave2
      # 配置第 1 个数据源
      master:
        driver-class-name: com.mysql.jdbc.Driver
        jdbc-url: jdbc:mysql://127.0.0.1:3306/sso
        password: 123456
        type: com.zaxxer.hikari.HikariDataSource
        username: root
      # 配置第 2 个数据源
      slave1:
        driver-class-name: com.mysql.jdbc.Driver
        jdbc-url: jdbc:mysql://127.0.0.1:3306/sso_test
        password: 123456
        type: com.zaxxer.hikari.HikariDataSource
        username: root
      # 配置第 3 个数据源
      slave2:
        driver-class-name: com.mysql.jdbc.Driver
        jdbc-url: jdbc:mysql://127.0.0.1:3306/slave_test
        password: 123456
        type: com.zaxxer.hikari.HikariDataSource
        username: root
    mode:
      # 内存模式
      type: Memory
    # 打印sql
    props:
      sql-show: true
    rules:
      readwrite-splitting:
        data-sources:
          myds:
            # 读数据源负载均衡算法名称
            load-balancer-name: alg_round
            props:
              # 读数据源名称,多个从数据源用逗号分隔
              read-data-source-names: slave1,slave2
              # 写数据源名称
              write-data-source-name: master
            # 读写分离类型,如: Static,Dynamic
            type: Static
        load-balancers:
          # 定义负载均衡算法:随机,轮询,权重
          alg_random:
            type: RANDOM
          alg_round:
            type: ROUND_ROBIN
          alg_weight:
            props:
              slave1: 1
              slave2: 2
            type: WEIGHT

创建数据库表

由于主、从数据库里的数据是一样的,所以sso和sso_test都用下面代码创建sys_business表

CREATE TABLE `sys_business` (
	`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
	`avaliable` TINYINT ( 1 ) DEFAULT '1' COMMENT '是否可用#0:禁用#1:启用',
	`name` VARCHAR ( 30 ) CHARACTER 
	SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '系统名称',
	`permission` VARCHAR ( 30 ) CHARACTER 
	SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '权限字符',
	`path` VARCHAR ( 100 ) CHARACTER 
	SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '路由地址',
	`icon` VARCHAR ( 30 ) CHARACTER 
	SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '图表',
	`create_time` datetime DEFAULT NULL COMMENT '创建时间',
	`update_time` datetime DEFAULT NULL COMMENT '更新时间',
	`delete_flag` TINYINT ( 1 ) DEFAULT '1' COMMENT '是否删除#1:未删除#0:已删除',
PRIMARY KEY ( `id` ) 
) ENGINE = INNODB AUTO_INCREMENT = 3 DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci;

编写实体类

@Data
@TableName("sys_business")
public class Sso {
    private Long id;

    private String name;
}

业务代码

mapper

public interface SsoMapper extends BaseMapper<Sso> {
}

service

public interface ISsoService extends IService<Sso> {
}

service实现类

@Service
public class ISsoServiceImpl extends ServiceImpl<SsoMapper, Sso> implements ISsoService {
}

测试

1、先在sso_test(从)读,后向sso(主)插(测试配置文件是否生效)

	@Resource
    private ISsoService iSsoService;
    
    @RequestMapping("/slace_master")
    public boolean masterTest(){
        Sso sso = iSsoService.getById(1L);
        System.out.println(sso.toString());
        return iSsoService.save(sso);
    }

当前从库中的数据:
在这里插入图片描述
主库此时还没有数据:
在这里插入图片描述
运行后:
在这里插入图片描述
先在从库中查出,然后向主库中写入,实现了数据的同步,说明集成生效了。

2、先插主库,后读从库(没有加事务)

因为sso_test没有对sso这个库的binlog日志进行监听,现在这两个库是没有同步关系的,写入sso后,不会同步到sso_test。


    @RequestMapping("insert_and_read")
    public boolean inAndRed(){
        Sso sso =new Sso();
        sso.setId(2L);
        sso.setName("TestName1");
        boolean save = iSsoService.save(sso);
        Sso byId = iSsoService.getById(2L);
        System.out.println(byId);
        return save;
    }

执行后主库中的数据:
在这里插入图片描述
执行后从库中的数据:
在这里插入图片描述
打印结果:
在这里插入图片描述

在2中的方法上加事务@Transactional注解(会强制读取刚执行完写入的库也就是主库)


    @RequestMapping("insert_and_read")
    @Transactional
    public boolean inAndRed(){
        Sso sso =new Sso();
        sso.setId(2L);
        sso.setName("TestName1");
        boolean save = iSsoService.save(sso);
        Sso byId = iSsoService.getById(2L);
        System.out.println(byId);
        return save;
    }

在这里插入图片描述

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

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

相关文章

十二、pikachu之URL重定向

文章目录 1、URL重定向概述2、实战3、URL跳转的几种方式:3.1 META标签内跳转3.2 javascript跳转3.3 header头跳转 1、URL重定向概述 不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。如果后端采用了前端传进来的&#xff08;可能是用户传参&#xff0c;或者之前预埋…

Allegro平台如何利用测评打造爆款产品,优化listing提升曝光度!

Allegro是波兰本土最大的电商平台&#xff0c;1999年由波兰人自己创造成立&#xff0c;75%的波兰人都知道该网站&#xff0c;Allegro的品牌认知度在波兰高达98%。也是东欧“最大”拍卖网站。 波兰的消费者非常熟悉Allegro平台&#xff0c;大部分波兰人如果想要购买商品&#x…

[uniapp] scroll-view 简单实现 u-tabbar效果

文章目录 方案踩坑1.scroll-view 横向失败2.点击item不滚动?3. scrollLeft从哪里来? 效果图 方案 官方scroll-view 进行封装 配合属性 scroll-left Number/String 设置横向滚动条位置 即可 scroll-into-view 属性尝试过,方案较难实现 踩坑 1.scroll-view 横向失败 安装…

很奇葩的Deepin下Miniconda安装之旅

前文写到安装富瀚微的工具链遇到的问题&#xff0c;接着又遇到了Miniconda的问题&#xff0c;始终停留在END这个页面。 弄了很久&#xff0c;最终怀疑是不是前面什么安装包搞错了&#xff0c;系统重装一遍&#xff0c;还是一样的问题。一通乱操作后&#xff0c;得以解决。现将过…

【AI】即使AI 时代,程序员也无需焦虑

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前学习C/C、算法、Python、Java等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&…

ARP攻击分析案例

1.用户需求 最近&#xff0c;医院的部分科室工作人员反映网络时不时会出现卡顿现象。尽管网络管理员已经采用了相关技术进行排查&#xff0c;但并未发现异常情况。因此&#xff0c;我们建议借助NetInside系统进一步分析和定位问题。 2.详细分析 针对上述异常问题&#xff0c…

第五十七章 恶魔通缉令

“嗐&#xff01;居然查来查去没查着&#xff01;” 坎迪摇摇头&#xff0c;继续道&#xff0c;“突然&#xff01;你猜怎么着&#xff1f;我居然感觉天空有双眼睛在盯着我&#xff0c;吓得我都不敢抬头看&#xff01;只觉得周身痒痒&#xff0c;却有一股力量迫使我缩颈闭嘴&am…

某网站DES加密逆向分析实战

文章目录 一、抓包分析二、加密分析一、重写加密 一、抓包分析 分析站点&#xff1a; aHR0cDovL2VpcC5jaGFuZmluZS5jb20v 首先我们提交一下登陆信息&#xff1a; 搜索j_password查看加密函数: 把上图搜索到的encryptPassword函数拿出来分析一下&#xff1a; function encryptP…

微客云直充卡券优惠话费充值接口开发稳定高效

微客云直充卡券话费 开发团队致力于此模块生命力至少3-5年 此模块以资源种类&#xff0c;官方直联接口为优势&#xff0c;不纯以软件更新为主&#xff0c;力争版本精准化服务用户 单独直充卡券话费系统&#xff0c;直接完成对各种消费场景的流量变现&#xff0c;更加开放与链路…

【RuoYi移动端】uniApp导入和引用uView2.0插件

一、打开uiew官网 安装 | uView 2.0 - 全面兼容 nvue 的 uni-app 生态框架 - uni-app UI 框架uView UI&#xff0c;是 uni-app 生态最优秀的 UI 框架&#xff0c;全面的组件和便捷的工具会让您信手拈来&#xff0c;如鱼得水https://uviewui.com/components/install.html 也可直…

香港服务器怎么打开SSH

​  SSH是一种远程登录协议&#xff0c;可以通过加密方式在网络上安全地传输数据。它允许用户在远程服务器上执行命令&#xff0c;管理文件和目录&#xff0c;并进行其他系统管理任务。 如何打开SSH服务? 1.确认已安装OpenSSH服务器&#xff1a; 你可以通过命令sudoapt-geti…

爬虫逆向实战(二十二)--某恩数据电影票房

一、数据接口分析 主页地址&#xff1a;某恩数据 1、抓包 通过抓包可以发现数据接口是API/GetData.ashx 2、判断是否有加密参数 请求参数是否加密&#xff1f; 无请求头是否加密&#xff1f; 无响应是否加密&#xff1f; 通过查看“响应”模块可以发现&#xff0c;响应是…

apache的ab工具测试网页优化效果速度以及服务器承载

今天为大家介绍一款apache自带的一种的测试网页优化效果速度以及服务器承载的工具——ab.exe。 大家在工作中或者开发中可以使用apache的ab工具来测试自己的网站并发量大小&#xff0c;和某个页面的访问时间。 一、基本用法 如果你是用的是apache的话&#xff0c;那么只要进…

opencv案例03 -基于OpenCV实现二维码生成,发现,定位,识别

1.二维码的生成 废话不多说&#xff0c;直接上代码 # 生成二维码 import qrcode# 二维码包含的示例数据 data "B0018" # 生成的二维码图片名称 filename "qrcode.png" # 生成二维码 img qrcode.make(data) # 保存成图片输出 img.save(filename)img.sh…

Windows操作系统打开Sketch文件的实用技巧!

在设计工作中&#xff0c;Sketch是一款非常受欢迎的矢量绘图软件&#xff0c;但由于它只能兼容Mac操作系统&#xff0c;对设计师有一定的局限性&#xff0c;Sketch的使用问题就成了困扰。今天本文将为大家分享一个在Windows系统也能打开Sketch文件的操作方法&#xff0c;一起来…

大模型+学习机,是概念游戏还是双向奔赴?

众所周知&#xff0c;2023年上半年大模型概念炙手可热。各大科技公司纷纷卷入&#xff0c;或宣称布局相关领域&#xff0c;或率先官宣自研大模型。而随着资本市场对大模型概念的热情有所消退&#xff0c;属于这片战场的新一轮角逐慢慢聚焦在了技术的落地应用上。 8月15日&#…

【学习FreeRTOS】第13章——FreeRTOS队列

1.队列简介 队列是任务到任务、任务到中断、中断到任务数据交流的一种机制&#xff08;消息传递&#xff09; FreeRTOS基于队列&#xff0c; 实现了多种功能&#xff0c;其中包括队列集、互斥信号量、计数型信号量、二值信号量、 递归互斥信号量&#xff0c;因此很有必要深入了…

手把手教你部署Jenkins教程,小白也能学会(多图预警)!

背景 公司的前端、后端构建及部署工作都是人工去做&#xff0c;随着业务扩大&#xff0c;项目迭代速度变快&#xff0c;人员增多&#xff0c;各种问题都暴露出来&#xff0c;将通过一个简单案例分享一下基于Jenkins的前后端自动化工作流搭建的过程&#xff0c;搭建完这套工作流…

做好客户服务的方法五部曲!

在每个商业领域中&#xff0c;提供优质的客户服务是成功的一个关键因素。无论企业的规模大小如何&#xff0c;都需要始终坚守为客户提供长期高质量服务的原则&#xff0c;以赢得客户信任与忠诚。今天&#xff0c;就让我们进一步探讨一下&#xff0c;客户服务有哪些方法技巧&…