springboot+shardingsphere实现读写分离和分表

news/2025/1/8 11:37:05/文章来源:https://www.cnblogs.com/cgy1995/p/18658184

参考:https://blog.csdn.net/weixin_44606481/article/details/140955787
前提:数据库配置了主从数据同步

1、依赖

<dependencies><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>5.2.0</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.4</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

2、读写分离

2.1 数据表:

CREATE TABLE `user` (`id` bigint(20) NOT NULL COMMENT '主键ID',`name` varchar(30) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '姓名',`age` int(11) DEFAULT NULL COMMENT '年龄',`email` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '邮箱',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

2.2 controller、service、Mapper、entity按平时的建立

package com.cgy.daily.controller;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.cgy.daily.entity.Iuser;
import com.cgy.daily.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
public class CesController {@AutowiredUserMapper userMapper;@GetMapping("/cs/test")public String test() {Iuser iuser = new Iuser();iuser.setName("tom-1");iuser.setAge(100);iuser.setEmail("tt@qq.com");userMapper.insert(iuser);return "test";}@GetMapping("/cs/list")public String list() {List<Iuser> iusers = userMapper.selectList(new LambdaQueryWrapper<>());System.out.println();return "test";}
}

2.3 配置application.yml文件

server:port: 9901
spring:shardingsphere:props:sql-show: truedatasource:names: ds1,ss0,ss1ds1:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/dailyhub?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=trueusername: rootpassword: 12345aassss0:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/dailyhub?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=trueusername: rootpassword: 12345aassss1:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/dailyhub?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=trueusername: rootpassword: 12345aassrules:readwrite-splitting:data-sources:ms:static-strategy:write-data-source-name: ds1read-data-source-names:- ss0- ss1load-balancer-name: round_robinload-balancers:round_robin:type: ROUND_ROBIN

当插入的时候,插入主库,查询的时候,轮询查询从库
image

image

3、分表

3.1 配置yaml文件

server:port: 9901
spring:shardingsphere:# 开启sql显示props:sql-show: truedatasource:#全部数据源名称,多个用逗号隔开names: ds1,ss0,ss1#主数据源ds1:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/dailyhub?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=trueusername: rootpassword: 12345aass# 从数据源0ss0:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/dailyhub?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=trueusername: rootpassword: 12345aass#从数据源1ss1:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/dailyhub?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=trueusername: rootpassword: 12345aassrules:sharding:tables:# user为需要分的表user表user:actual-data-nodes: ds1.user_$->{0..1}table-strategy:standard:sharding-column: idsharding-algorithm-name: user-inlinekey-generate-strategy:column: idkey-generator-name: snowflakesharding-algorithms:user-inline:type: INLINEprops:# 分片键为id,分片算法为INLINE,表达式为id % 2,即根据id的奇偶性决定数据存储在哪个表中algorithm-expression: user_$->{id % 2}key-generators:snowflake:# 使用SNOWFLAKE作为全局唯一ID生成器,确保分布式环境下的ID唯一性type: SNOWFLAKE
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

image

4、读写分离+分表

4.1 整合后的yml文件

server:port: 9901
spring:shardingsphere:# 开启sql显示props:sql-show: truedatasource:#全部数据源名称,多个用逗号隔开names: ds1,ss0,ss1#主数据源ds1:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/dailyhub?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=trueusername: rootpassword: 12345aass# 从数据源0ss0:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/dailyhub?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=trueusername: rootpassword: 12345aass#从数据源1ss1:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/dailyhub?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=trueusername: rootpassword: 12345aassrules:readwrite-splitting:data-sources:# cgy是逻辑数据源名称,用于读写分离 自己定义cgy:# 写操作将路由到主数据源ds1,读操作将路由到从数据源ss0和ss1static-strategy:write-data-source-name: ds1read-data-source-names:- ss0- ss1load-balancer-name: round_robinload-balancers:# 使用ROUND_ROBIN负载均衡策略在多个从数据源之间分发读请求。round_robin:type: ROUND_ROBINsharding:tables:# user为需要分的表user表user:# user表被分片到ms.user_0和ms.user_1两个实际物理表中,cgy为逻辑数据源名称actual-data-nodes: cgy.user_$->{0..1}table-strategy:standard:sharding-column: idsharding-algorithm-name: user-inlinekey-generate-strategy:column: idkey-generator-name: snowflakesharding-algorithms:user-inline:type: INLINEprops:# 分片键为id,分片算法为INLINE,表达式为id % 2,即根据id的奇偶性决定数据存储在哪个表中algorithm-expression: user_$->{id % 2}key-generators:snowflake:# 使用SNOWFLAKE作为全局唯一ID生成器,确保分布式环境下的ID唯一性type: SNOWFLAKE
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

查询从从库里分表查,插入到主库的分表。
image
image

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp 荣耀手机 没有检测到设备 运行到Android手机 真机运行

背景: 使用uniapp框架搭建的项目,开发的时候在浏览器运行,因为项目要打包成App,所以需要真机联调,需要运行到Android手机,在手机上查看/运行项目。通过真机调试才能确保软件开发的准确性和页面显示的完整性。操作步骤:1.Usb连接手机和电脑,电脑上的HbuilderX打开项目;…

DC-5 靶场通关小记

rustscan端口扫描指纹识别、LFI漏洞+文件包含(nginx日志)GetShell、screen-4.5.0提权地址 https://www.vulnhub.com/entry/dc-5,314/环境配置 有兼容性问题参考 https://www.cnblogs.com/lrui1/p/18655388 信息收集 ./rustscan -a 192.168.74.130 -- -A -sC Open 192.168.74.13…

ABB IRB5500喷涂机械手维修细节查看

ABB IRB5500喷涂机器人的控制柜常见故障表现形式主要包括以下几种:1、控制柜不能启动:可能原因包括电源故障、控制电路板损坏、保险丝烧断等。处理方法包括检查电源是否正常、控制电路板是否有损坏迹象、保险丝是否烧断等。 2、abb涂装机械手控制柜报错或异常:可能原因包括…

新年新机遇:跨境电商选品策略大揭秘

跨境电商在进行新年选品时,需要综合考虑市场调研、竞争对手分析、品牌选择、价格定位、物流考虑、汇率研究、多元化产品线以及节日和特殊事件等多个因素。通过精心策划和准备,可以确保所选产品在新年期间取得良好的销售业绩。在进行跨境电商新年选品时,需要考虑多个因素以确…

年度重磅 |《2024华为开发者宝典》免费下载,多维度解读华为根生态技术

摘要:20多位华为云DTSE专家打造,10+技术领域全覆盖,图文干货+视频讲解,多维度解读华为根生态技术,拥抱技术变革,开启创新之旅。 一年一度!大家最期待的华为开发者宝典新鲜出炉!在刚刚过去的2024年,华为云开发者联盟通过25场精彩的DTSE Tech Talk直播活动,为广大开发者…

WPF页面中将一个控件的宽度绑定到其父级用户控件的实际宽度

通常情况下,使用相对宽度(如 * 星号单位)和适当的 HorizontalAlignment 是最简单有效的方法,可以确保子控件随着父控件的大小变化而自动调整。如果需要更精确的控制,可以考虑使用 RelativeSource 绑定或其他高级技术。确保父容器也支持子控件的动态尺寸调整非常重要。该实…

Windows 系统下 Docker 和 Docker Compose 安装配置:一键部署有来开源项目本地环境

在 Windows 系统上安装 Docker 和 Docker Compose,实现一键部署有来开源项目的本地环境,包括单体应用和微服务架构。🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🍃 vue-uniapp-template 🌺 仓库主页: GitCod…

Openfiler iscsi共享存储连接访问配置

Openfiler、iscsi案例说明: 通过openfiler虚拟机模拟iscsi server建立存储共享,测试多路径(multipath)配置。 测试架构:iscsi server网络配置:一、通过firefox浏览器访问openfiler服务配置 1、连接服务配置失败2、修改TLS认证级别3、连接访问openfiler配置服务二、配置op…

SQL Server数据库备份、差异备份、日志备份脚本.250108

1,sp脚本 USE [master] GO /****** Object: StoredProcedure [dbo].[sp_BackupDatabase] Script Date: 2025/1/8 10:43:05 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO-- Author: Amadeus-- Create date: 2021-10-20 exec sp_BackupDatabase L-- Descrip…

JuiceFS 2024:开源与商业并进,迈向 AI 原生时代

即将过去的 2024 年,是 JuiceFS 开源版本推出的第 4 年,企业版的第 8 个年头。回顾过去这一年,JuiceFS 社区版依旧保持着快速成长的势头,GitHub 星标突破 11.1K,各项使用指标增长均超过 100%,其中文件系统总数量较前一年更是增长了 8.5 倍;企业版同样持续保持高速增长,…

智慧防洪平台:构建城市安全的数字防线

随着全球气候变化的加剧和城市化进程的加快,城市防洪问题日益凸显。智慧防洪平台作为智慧城市建设的重要组成部分,其核心目标是通过集成先进的信息技术和数据分析,实现对城市洪涝灾害的有效预防和应对。本文将深入探讨智慧防洪平台的建设内容,以期为城市安全提供强有力的数…

如何通过数据分析优化电商营销策略和客户体验

一、电商数据的收集 电商平台的数据来源多样,包括用户行为数据、交易数据、客户反馈数据、商品信息数据等。高效的数据收集不仅是数据分析的前提,也是实现精准决策的基础。 1.1 数据收集的主要来源 用户行为数据:用户在电商平台上的每一次点击、浏览、搜索、加入购物车、下单…