ShardingSphere实战(2)- 水平分表

news2024/12/23 22:19:00

上篇博客,我们讲了 ShardingSphere实战(1)- 分库分表基础知识,这篇博客,正式开始实操。

项目环境:
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 null
        primary 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 null
        primary 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 null
        primary 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 null
        primary 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);
    }

    @RequestMapping
    public 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=true

mybatis.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 t2OrderId
    from t_order t1
             inner join t_order_item t2 on t1.order_id = t2.order_id
    where t1.order_id = #{orderId,jdbcType=BIGINT}
</select>

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

六、完整配置

为了方便查看,下面放一个本篇博客关于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:3316/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}


####################### 配置分片表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}

# 是否开启 SQL解析日志
spring.shardingsphere.props.sql.show=true

mybatis.mapper-locations=classpath:sqlmapper/*.xml

总结:本篇博客实现了水平分表,后续会陆续更新分库分表绑定表广播表

下一篇:ShardingSphere实战(3)- 快速实现分库分表

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

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

相关文章

filebeat发送日志

filebeat: 1.可以在本机收集日志 2.也可以远程收集日志 3.轻量级的日志收集系统&#xff0c;可以在非Java环境运行 logstash是在jvm环境中运行&#xff0c;资源消耗很高&#xff0c;启动一个logstash需要消耗500M左右的内存 filebeat只消耗10M左右的内存 test3是装有logstash的…

C语言的内存布局

根据 C 语言的内存布局规律&#xff0c;通常局部变量和全局变量哪一个的地址更小&#xff1f; 答&#xff1a;如图所示。 下面代码中&#xff0c;为何两个不同的变量可以存放在同一个地址上&#xff1f; #include <stdio.h> void func1(void); void func2(void); voi…

安装 qcloud-python-sts 失败 提示 gbk codecs decode byte 应该如何解决

安装 qcloud-python-sts 失败 提示 gbk codecs decode byte 应该如何解决 解决方案&#xff1a; 将windows 修改为utf-8编码格式 解决步骤如下&#xff1a; 1. 进入控制台 2. 点击区域 4. 点击管理 4.勾选UTF-8 5.重启系统即可

Java零基础之多线程篇:线程间如何通信?

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

计算机技术基础 (bat 批处理)Note6

计算机技术基础 &#xff08;bat 批处理&#xff09;Note6 本节主要讲解FOR命令语句&#xff08;循环&#xff09;在 bat 批处理中的使用 (part 2) 变量延迟 命令语句 在没有开启变量延迟的情况下&#xff0c;批处理命令行中的变量改变&#xff0c;必须到下一条命令才能体现…

C++ STL在算法题中的常用语法

Vector 1.将vector<int>中的元素全部置换为0 fill(vec.begin(), vec.end(), 0); 2.vector容器是可以直接用比较是否值等的&#xff01; Unordered_set 1. unordered_set的删除&#xff08;count的值也会减少&#xff09; 2.unordered_map中的int默认值是0&#xff0c;…

Prometheus-v2.45.0+Grafana+邮件告警

目录 普罗米修斯监控架构介绍 Prometheus 监控架构 1. 数据抓取&#xff08;Scraping&#xff09; 2. 时序数据库&#xff08;TSDB&#xff09; 3. 数据模型 4. PromQL 查询语言 5. 告警&#xff08;Alerting&#xff09; 6. Alertmanager 7. 可视化&#xff08;Visu…

从0开始搭建vue + flask 旅游景点数据分析系统( 六):搭建后端flask框架

这一期开始开发header部分&#xff0c;预期实现两个目标&#xff1a; 创建 Flask 项目导入旅游数据后端实现旅游数据的查询 1 python 环境 & 开发环境 python 安装和pycharm安装需要去网上找包&#xff0c;建议python使用3.8 或者3.9版本 2 新建项目 我们新建一个文件…

Kafka详解以及常见kafka基本操作

1、 kafka 是什么,有什么作用 Kafka是一个开源的高吞吐量的分布式消息中间件&#xff0c;对比于缓冲和削峰&#xff1a;上游数据时有突发流量&#xff0c;下游可能扛不住&#xff0c;或者下游没有足够多的机器来保证冗余&#xff0c;kafka在中间可以起到一个缓冲的作用&#x…

Qt项目——文本编辑器(Bug/疑问)

项目地址&#xff1a;GitHub - Outlier9/CatEditor: Cat文本编辑器--Qt 有帮助的话各位点点 star 啦&#xff0c;感谢&#xff01; 如果有需要学习该项目的人&#xff0c;觉得看文档较为困难&#xff0c;可以加我联系方式&#xff0c;给github点个star后可免费提供学习视频&…

红酒与烹饪:美食的灵感之源

在烹饪的广阔天地中&#xff0c;红酒常常作为一道神秘的佐料&#xff0c;为菜肴带来别样的风味与深度。当定制红酒洒派红酒&#xff08;Bold & Generous&#xff09;与烹饪艺术相遇&#xff0c;一场美食的灵感之旅便悄然展开。 一、红酒与烹饪的浪漫邂逅 在烹饪的世界里&…

12月长沙学术会议:EI检索,机器人、自动化与智能控制方向

在春意盎然、生机勃勃的四月&#xff0c;全球科技界的目光聚焦于中国长沙&#xff0c;这里即将迎来一场科技与智慧碰撞的盛宴——第四届机器人、自动化与智能控制国际会议&#xff08;ICRAIC 2024&#xff09;。本次盛会由历史悠久、文化底蕴深厚的湖南第一师范学院荣耀主办&am…

正点原子imx6ull-mini-Linux驱动之platform设备驱动实验(14)

我们在前面几章编写的设备驱动都非常的简单&#xff0c;都是对IO进行最简单的读写操作像I2C、 SPI、LCD 等这些复杂外设的驱动就不能这么去写了&#xff0c;Linux 系统要考虑到驱动的可重用性&#xff0c;因此提出了驱动的分离与分层这样的软件思路&#xff0c;在这个思路下诞生…

QtQuick Text-文本样式

属性 Text项目的style属性可以设置文本的样式。 支持的文本样式有&#xff1a; Text.Normal&#xff08;默认&#xff09;Text.OutlineText.RaisedText.Sunken 示例 import QtQuickRow{spacing: 10padding: 10Text {font.pointSize: 40text: "Normal"}Text {font…

太阳光大约8分钟到达地球?太阳光:我一瞬间就到了!

我们常常听说,太阳光从太阳出发,需要8分钟才能抵达地球。这个时间听起来并不长,但它却是光子在宇宙空间中以惊人速度穿行的见证。 不过,这个8分钟的时间概念,实际上是站在我们地球观察者的角度来说的。如果我们换一个角度,比如说,从光子自己的视角来看待这段旅程,又会是…

2-53 基于matlab的15种图像纹理特征计算

基于matlab的15种图像纹理特征计算。纹理特征包括小梯度优势 T1、大梯度优势 T2、 灰度分布的不均匀性 T3、 梯度分布的不均匀性 T4 、能量 T5、灰度平均 T6、梯度平均 T7、灰度均方差 T8 、梯度均方差 T9、相关 T10 、灰度熵 T11、梯度熵 T12 、 混合熵 T13、惯性 T14 、 逆差…

字符专用输入输出函数 getchar() putchar()

文章目录 一、字符专用接收函数1.1 scanf实现字符接收1.2 字符专用接收函数getchar1.3 练习1.4 利用循环使字符接收函数接收字符串的元素 二、字符专用输出函数2.1 printf实现打印字符2.2 字符专用输出函数putchar 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例…

iOS 系统提供的媒体资源选择器(UIImagePickerController)

简介 图片或者视频的选择功能几乎是每个APP必不可少的&#xff0c;UIImagePickerController 是 iOS 系统提供的一个方便的媒体选择器&#xff0c;允许用户从照片库中选择图片或视频&#xff0c;或者使用相机拍摄新照片和视频。 它的页面简单易用&#xff0c;代码稳定可靠&…

基于STC8H系列单片机的比较器功能调试

基于STC8H系列单片机的比较器功能调试 STC8H4K64TL单片机介绍STC8H4K64TL单片机管脚图(48个引脚)STC8H4K64TL单片机串口仿真与串口通信STC8H4K64TL单片机管脚图(32个引脚)STC8H4K64TL单片机管脚图(20个引脚)STC8H系列单片机管脚说明STC8H系列单片机I/O口STC8H系列单片机I…

八股文真的有作用吗?

八股文在实际工作中的作用&#xff1a;助力、阻力还是空谈&#xff1f; 无论如何讨论&#xff0c;八股文都是面试中不可或缺的一环。一般来说&#xff0c;准入门槛是由“招聘”这个“游戏”的设计者设计的&#xff0c;旨在快速高效地筛选出合适的人选。 但是我还是要说&#x…