ShardingSphere实战(2)- 水平分表

项目环境:
JDK11
MySQL 8.0.30
Springboot 2.7.4 + Mybatis + ShardingSphere + HikariCP 连接池

一、Maven 依赖

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.4</version>
</parent><dependencies><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>33.2.1-jre</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- mysql驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- ShardingSphere --><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.1.1</version></dependency><!--HikariCP 高性能的JDBC连接池--><dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><version>5.0.0</version></dependency><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version></dependency></dependencies>

二、创建数据库

在这里插入图片描述

create database ds-0;create table t_order_0
(order_id    bigint         not nullprimary key,order_no    varchar(100)   null,create_name varchar(50)    null,price       decimal(10, 2) null
)
create table t_order_1
(order_id    bigint         not nullprimary key,order_no    varchar(100)   null,create_name varchar(50)    null,price       decimal(10, 2) null
)create table t_order_item_0
(order_item_id bigint         not nullprimary key,item_id       bigint         null,order_id      bigint         null,item_name     varchar(50)    null,price         decimal(10, 2) null
)
create table t_order_item_1
(order_item_id bigint         not nullprimary key,item_id       bigint         null,order_id      bigint         null,item_name     varchar(50)    null,price         decimal(10, 2) null
)

三、项目搭建

在这里插入图片描述

package com.shardingsphere.demo;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@SpringBootApplication
@MapperScan({"com.shardingsphere.demo.dal.mapper"})
public class ShardingsphereDemoApplication {public static void main(String[] args) {SpringApplication.run(ShardingsphereDemoApplication.class, args);}@RequestMappingpublic String health() {return "shardingsphere-demo is ok!";}
}

实体类以及 mapper 的具体代码就不贴了,就是一个简单的 springboot + mybatis 项目。

四、单个表配置 ShardingSphere 分片策略

# sharding-jdbc 水平分表策略
# 给数据源起别名,这里名称需要和下面的一致
spring.shardingsphere.datasource.names=ds-0# 配置数据源
spring.shardingsphere.datasource.ds-0.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds-0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds-0.jdbc-url=jdbc:mysql://xxx:3306/ds-0?serverTimezone=UTC&useSSL=false
spring.shardingsphere.datasource.ds-0.username=xxx
spring.shardingsphere.datasource.ds-0.password=xxx####################### 配置分片表t_order #######################
# 指定真实数据节点
spring.shardingsphere.sharding.tables.t_order.actual-data-nodes=ds-0.t_order_$->{0..1}### 分表策略
# 分表分片健
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.sharding-column=order_id
# 分表算法
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expression=t_order_$->{order_id % 2}# 是否开启 SQL解析日志
spring.shardingsphere.props.sql.show=truemybatis.mapper-locations=classpath:sqlmapper/*.xml

1. 插入数据

/*** 单个表水平分表测试-保存*/
@GetMapping("/test1")
public String test1(@RequestParam("count") Integer count) {for (int i = 0; i < count; i++) {OrderDO order = new OrderDO();order.setOrderId(this.getId());order.setOrderNo("A" + order.getOrderId());order.setCreateName("订单 " + order.getOrderId());orderMapper.insertSelective(order);}return "success";
}

运行代码,可以看到 order_id 为偶数进了 t_order_0,为奇数进了t_order_1,和我们配置的分片规则一致。

在这里插入图片描述

2. 查询数据

/*** 单个表水平分表测试-查询*/
@GetMapping("/test2")
public String test2(@RequestParam("orderId") Long orderId) {OrderDO orderDO = orderMapper.selectByPrimaryKey(orderId);log.info("orderDO: {}", orderDO.toString());return "success";
}

运行代码,可以看到 order_id 为偶数查询 t_order_0,为奇数查询t_order_1,和我们配置的分片规则一致。
在这里插入图片描述
到目前为止,一个最简单的分表 demo 就完成了。

五、多个表配置 ShardingSphere 分片策略

如果我们还有一张t_order_item表,也需要分表,并且同样需要按照order_id分片
在上面配置的基础上,加上下面的配置:

####################### 配置分片表t_order_item #######################
# 指定真实数据节点
spring.shardingsphere.sharding.tables.t_order_item.actual-data-nodes=ds-0.t_order_item_$->{0..1}### 分表策略
# 分表分片健
spring.shardingsphere.sharding.tables.t_order_item.table-strategy.inline.sharding-column=order_id
# 分表算法
spring.shardingsphere.sharding.tables.t_order_item.table-strategy.inline.algorithm-expression=t_order_item_$->{order_id % 2}

1. 插入数据

/*** 多个表水平分表测试-保存*/
@GetMapping("/test3")
public String test3(@RequestParam("count") Integer count) {for (int i = 0; i < count; i++) {OrderDO order = new OrderDO();order.setOrderId(this.getId());order.setOrderNo("A" + order.getOrderId());order.setCreateName("订单 " + order.getOrderId());orderMapper.insertSelective(order);OrderItemDO orderItem = new OrderItemDO();orderItem.setOrderItemId(order.getOrderId());orderItem.setOrderId(order.getOrderId());orderItemMapper.insertSelective(orderItem);}return "success";
}

运行结果就不看了,和上面一致,按照order_id分片

2. 查询数据

/*** 多个表水平分表测试-查询*/
@GetMapping("/test4")
public String test4(@RequestParam("orderId") Long orderId) {List<OrderItemExtDO> orderDO = orderMapper.findOrderAndOrderItemsByOrderId(orderId);log.info("orderDO: {}", orderDO.toString());return "success";
}
<select id="findOrderAndOrderItemsByOrderId" resultType="com.shardingsphere.demo.dal.entity.OrderItemExtDO">select t1.order_id t1OrderId,t1.order_no orderNo,t2.order_id t2OrderIdfrom t_order t1inner join t_order_item t2 on t1.order_id = t2.order_idwhere t1.order_id = #{orderId,jdbcType=BIGINT}
</select>

和单表不一样,这次是t_ordert_order_item表关联查询,观察结果:
在这里插入图片描述
可以看到,sql 执行了两次,也就是说取的是笛卡尔积,可以想象,如果我们分表数量多,查询效率肯定极低,所以针对这种情况,我们需要配置绑定表


总结:简单实现了水平分表,下一篇博客,学习分库分表以及绑定表广播表

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

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

相关文章

C++ | string

前言 本篇博客讲解c中的string类的使用(常用接口) &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;C_普通young man的博客-CSDN博客 ⏩ 本人giee:普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见&#x1f4dd; &#x1f389…

Redis持久化之RDB和AOF详解

持久化是确保 Redis 数据在服务器重启或崩溃时不丢失的关键功能。由于 Redis 是基于内存的数据库&#xff0c;如果不进行持久化&#xff0c;所有数据都存在于内存中&#xff0c;一旦服务器进程退出&#xff0c;内存中的数据就会丢失。持久化机制可以将 Redis 的数据库状态保存到…

C# Unity 面向对象补全计划 之 访问修饰符

本文仅作学习笔记与交流&#xff0c;不作任何商业用途&#xff0c;作者能力有限&#xff0c;如有不足还请斧正 本系列旨在通过补全学习之后&#xff0c;给出任意类图都能实现并做到逻辑上严丝合缝

vue3项目结构梳理:

总览 1.vscode文件&#xff1a; 通常用于存放Visual Studio Code编辑器的插件的配置 2.node_moudles文件夹&#xff1a; 这个文件夹包含了项目所需的所有npm依赖包。&#xff08;需要在根目录下执行npm i命令安装这个文件夹&#xff09; 或者在项目根目录&#xff08;packa…

postgresql密码复杂度验证和有效期

前言 为了数据库安全以及应对等保测评等要求&#xff0c;我们需要设置密码复杂度。我们通过passwordcheck模块实现复杂度检测功能。 启用密码复杂度验证 找到自己安装pg库的配置文件目录&#xff0c;修改postgresql.conf vim postgresql.conf修改如下内容 shared_preload_…

中国十大顶级哲学家,全球公认的伟大思想家颜廷利:人类为何拥有臀部

人类为何拥有臀部&#xff1f;若众生皆无此部位&#xff0c;又如何能寻得一处真正属于自己的“座位”&#xff1f;在博大精深的中国传统文化中&#xff0c;汉字“座”与“坐”均蕴含“土”字元素。在易经的智慧里&#xff0c;作为五行之一的“土”&#xff0c;象征着人类社会的…

MySQL8--用户与权限管理

原文网址&#xff1a;MySQL8--用户与权限管理_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍MySQL8的用户与权限的管理&#xff0c;包括&#xff1a;用户的创建与删除、授权与撤销权限等。 为什么要管理用户与权限&#xff1f; 目的是保证数据库的安全性&#xff0c;只授…

Unity Shader unity文档学习笔记(十八):unity雾效原理

看很多文章用近平面远平面组成矩阵后转到裁剪空间下通过Z值来解&#xff0c;实际更简单的方式可以直接通过判断距离来实现 FogMgr控制远近面 public class TestFog : MonoBehaviour {public int startDis 0;public int endDis 50;public Vector4 fogParam;public void Awak…

文件未保存后能否恢复?分享实用恢复指南,6个方法

在日常用电脑时文件未保存而导致的数据丢失&#xff0c;是许多人都会遭遇的棘手问题。那么面对这样的情况&#xff0c;文件真的能够恢复吗&#xff1f;本文将深入分析文件恢复的可能性&#xff0c;并提供一系列实用的建议。 一、了解文件恢复的基础 首先我们需要明白文件恢复并…

并发--快速查询死锁信息

使用jstack查看线程堆栈信息 jstack&#xff1a;jdk提供的一个工具&#xff0c;可以查看java进程中线程堆栈信息。 位于&#xff1a;jdk1.8.0_121\bin包下 死锁代码 public class DeadLockDemo {private static String A "A";private static String B "B"…

uniapp微信小程序本地和真机调试文件图片上传成功但体验版不成功

文章目录 导文是因为要添加服务器域名&#xff01; 导文 uniapp微信小程序本地和真机调试文件图片上传成功但体验版不成功 uniapp微信小程序体验版上传图片不成功 微信小程序本地和真机调试文件图片上传成功但体验版不成功 是因为要添加服务器域名&#xff01; 先看一下 你小程…

[Docker][Docker Image]详细讲解

目录 1.Docker镜像是什么&#xff1f;2.Docker镜像加载原理1.bootfs2.rootfs3.为什么CentOS镜像几个G&#xff0c;而Docker CentOS镜像才几百M&#xff1f;1.CentOS2.Docker CentOS 3.镜像分层1.Union FS2.分层理解3.容器层 vs 镜像层 4.镜像命令1.docker images2.docker image…

fusetech_plus项目问题解决(若依魔改系列)

首页一直出现这个问题解决&#xff0c;是因为访问入口都在admin模块&#xff0c;所以必须在admin的pom里 引入blog模块 template might not exist or might not be accessible by any of the configured Template Resolvers 这个问题 类似mapper找不到问题 路径不对&#xf…

Android Compose 中的 UI 状态魔法:优雅处理加载、空状态和数据展示

Android Compose 中的 UI 状态魔法:优雅处理加载、空状态和数据展示 在Jetpack Compose中处理UI界面状态的这种情况,我们可以使用一个密封类(sealed class)来表示不同的UI状态,然后根据状态来显示相应的UI。以下是一个实现这种功能的示例: 首先,定义一个表示UI状态的密…

Selenium与WebDriver:Errno 8 Exec格式错误的多种解决方案

概述 在使用Selenium和WebDriver进行网页自动化时&#xff0c;可能会遇到各种错误。其中一个常见问题是执行格式错误&#xff08;Errno 8 Exec format error&#xff09;。这个错误通常在运行ChromeDriver时出现&#xff0c;错误提示涉及路径中的某个文件&#xff0c;如THIRD_…

什么是三级管?怎么区分PNP和NPN两种?

1.什么是三极管&#xff1f; 三极管&#xff0c;全称应为半导体三极管&#xff0c;也称双极型晶体管、晶体三极管&#xff0c;是一种控制电流的半导体器件。其作用是把微弱信号放大成幅度值较大的电信号&#xff0c;也用作无触点开关。三极管是半导体基本元器件之一&#xff0…

qiankun 微前端 隔离子应用样式,解决 ant-design-vue 子应用样式污染问题(已落地)

样式冲突产生原因 先分析乾坤qiankun 构建之后&#xff0c;会根据你的配置 给每个子应用生成一个id&#xff0c; 当加载到对应子应用的时候&#xff0c;就把内容放到对应的id 标签里去&#xff0c; 这样能有效的隔离 js 代码&#xff0c;但是样式是加载在全局的 所以 当两个子…

080基于ssm+vue的大学生兼职信息系统

开发语言&#xff1a;Java框架&#xff1a;ssmJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.…

matlab仿真 信道编码和交织(上)

&#xff08;内容源自详解MATLAB&#xff0f;SIMULINK 通信系统建模与仿真 刘学勇编著第八章内容&#xff0c;有兴趣的读者请阅读原书&#xff09; ​​​ ​ ​ ​ clear all N10;%信息比特的行数 n7;%hamming码组长度n2^m-1 m3;%监督位长度 [H,G]hammgen(m);%产生(n,n-…

ai写作一键生成软件有哪些免费的网站推荐

AI写作助手大揭秘&#xff01;1秒提升创作力&#xff0c;高效出文秘籍&#xff01; 在这个信息爆炸的时代&#xff0c;每个人都可以成为信息的发布者。 不论是个人博客、社交媒体更新&#xff0c;还是学术文章、企业报告&#xff0c;写作无处不在。 然而&#xff0c;高质量的…