iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >SpringBoot+MybatisPlus+Mysql+Sharding-JDBC分库分表
  • 722
分享到

SpringBoot+MybatisPlus+Mysql+Sharding-JDBC分库分表

2024-04-02 19:04:59 722人浏览 薄情痞子
摘要

目录一、序言1、组件及版本选择2、预期目标二、代码实现(一)素材准备1、实体类2、Mapper类3、全局配置文件(二)增删查改1、保存数据2、查询列表数据3、分页查询数据4、查询详情

一、序言

在实际业务中,单表数据增长较快,很容易达到数据瓶颈,比如单表百万级别数据量。当数据量继续增长时,数据的查询性能即使有索引的帮助下也不尽如意,这时可以引入数据分库分表技术。

本文将基于SpringBoot+mybatisPlus+Sharding-JDBC+Mysql实现企业级分库分表。

1、组件及版本选择

  • springBoot 2.6.x
  • MybatisPlus 3.5.0
  • Sharding-JDBC 4.1.1
  • mysql 5.7.35

2、预期目标

  • 使用上述组件实现分库分表,简化起见只讨论分表技术
  • 完成分表后的逻辑表与物理表间的增删查改
  • 引入逻辑删除和使用MybatisPlus内置分页技术

完整项目源码访问地址。

二、代码实现

为了简化分表复杂性,专注于分表整体实现,简化分表逻辑:按照UserId的奇偶属性分别进行分表。以订单表这一典型场景为例,一般来说有关订单表,通常具有如下共性行为:

  • 创建订单记录
  • 查询XX用户的订单列表
  • 查询XX用户的订单列表(分页)
  • 查询XX订单详情
  • 修改订单状态
  • 删除订单(逻辑删除)

接下来通过代码实现上述目标。

(一)素材准备

1、实体类

@Data
@TableName("bu_order")
public class Order {
    @TableId
    private Long orderId;
    private Integer orderType;
    private Long userId;
    private Double amount;
    private Integer orderStatus;
    @TableLogic
    @JSONIgnore
    private Boolean deleted;
}

2、Mapper类

@Mapper
public interface OrderMapper extends BaseMapper<Order> {
}

3、全局配置文件

spring:
  config:
    use-legacy-processing: true
  shardingsphere:
    datasource:
      ds1:
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.alibaba.druid.pool.DruidDataSource
        url: jdbc:mysql://127.0.0.1:3306/sharding-jdbc2?serverTimezone=UTC
        username: root
        passWord: 123456
      names: ds1
    props:
      sql:
        show: true
    sharding:
      tables:
        bu_order:
          actual-data-nodes: ds1.bu_order_$->{0..1}
          key-generator:
            column: order_id
            type: SNOWFLAKE
          table-strategy:
            inline:
              alGorithm-expression: bu_order_${user_id%2}
              sharding-column: user_id

(二)增删查改

1、保存数据

由于依据主键的奇偶属性对原表分表,分表后每张表的数据量是分表前的二分之一。根据需要也可以自定义分表数量(比如10张),新分表后的数据量是不分表前的十分之一。

@Test
public void addOrders() {
    for (long i = 1; i <= 10; i++) {
        Order order = new Order();
        order.setOrderId(i);
        order.setOrderType(RandomUtil.randomEle(Arrays.asList(1, 2)));
        order.setUserId(RandomUtil.randomEle(Arrays.asList(101L, 102L, 103L)));
        order.setAmount(1000.0 * i);
        orderMapper.insert(order);
    }
}

2、查询列表数据

查询指定用户的订单列表。

@GetMapping("/list")
public ajaxResult list(Order order) {
    LambdaQueryWrapper<Order> wrapper = Wrappers.lambdaQuery(order);
    return AjaxResult.success(orderMapper.selectList(wrapper));
}

3、分页查询数据

分页查询指定用户的订单列表

@GetMapping("/page")
public AjaxResult page(Page<Order> page, Order order) {
    return AjaxResult.success(orderMapper.selectPage(page, Wrappers.lambdaQuery(order)));
}

4、查询详情

通过订单ID查询订单详情。

@GetMapping("/detail/{orderId}")
public AjaxResult detail(@PathVariable Long orderId) {
    return AjaxResult.success(orderMapper.selectById(orderId));
}

5、删除数据

通过订单ID删除订单(逻辑删除)

@DeleteMapping("/delete/{orderId}")
public AjaxResult delete(@PathVariable Long orderId) {
    return AjaxResult.success(orderMapper.deleteById(orderId));
}

6、修改数据

修改数据一般涉及部分列,比如修改订单表的订单状态等。

@PutMapping("/edit")
public AjaxResult edit(@RequestBody Order order) {
    return AjaxResult.success(orderMapper.updateById(order));
}

三、理论分析

1、选择分片列

选择分片列是经过精心对比后确定的,对于订单类场景,需要频繁以用户ID为查询条件筛选数据,因此将同一个用户的订单数据存放在一起有利于提高查询效率。

2、扩容

当分表后的表数据快速增长,可以预见即将达到瓶颈时,需要对分表进行扩容,扩容以2倍的速率进行,扩容期间需要迁移数据,工作量相对可控。

到此这篇关于SpringBoot+MybatisPlus+Mysql+Sharding-JDBC分库分表 的文章就介绍到这了,更多相关SpringBoot分库分表 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: SpringBoot+MybatisPlus+Mysql+Sharding-JDBC分库分表

本文链接: https://www.lsjlt.com/news/140839.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBoot+MybatisPlus+Mysql+Sharding-JDBC分库分表
    目录一、序言1、组件及版本选择2、预期目标二、代码实现(一)素材准备1、实体类2、Mapper类3、全局配置文件(二)增删查改1、保存数据2、查询列表数据3、分页查询数据4、查询详情...
    99+
    2024-04-02
  • SpringBoot 如何使用sharding jdbc进行分库分表
    目录基于4.0版本,Springboot2.1在pom里确保有如下引用里面我profiles.active了另一个之后手工把表都建好写个测试代码需要注意一个坑基于4.0版本,Spri...
    99+
    2024-04-02
  • 怎么用Sharding-Jdbc进行分库分表
    这篇文章主要介绍“怎么用Sharding-Jdbc进行分库分表”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用Sharding-Jdbc进行分库分表”文章能帮助大家解决问题。1. Shardin...
    99+
    2023-06-28
  • SpringBoot怎么整合sharding-jdbc实现分库分表与读写分离
    本篇内容主要讲解“SpringBoot怎么整合sharding-jdbc实现分库分表与读写分离”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot怎么整合sharding-jdbc...
    99+
    2023-06-25
  • SpringBoot整合sharding-jdbc实现自定义分库分表的实践
    目录一、前言二、简介1、分片键2、分片算法三、程序实现一、前言 SpringBoot整合sharding-jdbc实现分库分表与读写分离 本文将通过自定义算法来实现定制化的分库分表来...
    99+
    2024-04-02
  • springboot怎么配置sharding-jdbc水平分表
    这篇文章主要讲解了“springboot怎么配置sharding-jdbc水平分表”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“springboot怎么配置sharding-jdbc水平分表...
    99+
    2023-06-21
  • SpringBoot整合sharding-jdbc实现分库分表与读写分离的示例
    目录一、前言二、数据库表准备三、整合四、docker-compose部署mysql主从五、本文案例demo源码一、前言 本文将基于以下环境整合sharding-jdbc实现分库分表与...
    99+
    2024-04-02
  • Java使用Sharding-JDBC分库分表进行操作
    目录主从库搭建Compose FileMaster 配置Slave 配置主从配置创建分库分表Order 1 库Order 2 库User 库Sharding-JDBC 引入Shard...
    99+
    2024-04-02
  • Sharding-Jdbc 自定义复合分片的实现(分库分表)
    目录Sharding-JDBC的数据分片策略分片键分片算法分片策略SQL Hint实战–自定义复合分片策略小结Sharding-JDBC中的分片策略有两个维度,分别是: 数...
    99+
    2024-04-02
  • SpringBoot整合sharding-jdbc实现自定义分库分表的方法是什么
    这篇文章主要讲解了“SpringBoot整合sharding-jdbc实现自定义分库分表的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot整合sharding-j...
    99+
    2023-06-25
  • 利用Sharding-Jdbc进行分库分表的操作代码
    目录1.Sharding-Jdbc介绍2.Sharding-Jdbc引入使用3.配置广播表4.配置绑定表5.读写分离配置1. Sharding-Jdbc介绍 https://shar...
    99+
    2024-04-02
  • sharding-jdbc分库连接数优化
    在sharding-jdbc中,分库连接数的优化主要包括以下几个方面:1. 设置合适的连接池大小:根据实际业务需求和硬件配置,设置合...
    99+
    2023-09-08
    优化
  • 如何使用sharding-jdbc实现水平分库+水平分表
    这篇文章给大家分享的是有关如何使用sharding-jdbc实现水平分库+水平分表的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。分库分表策略:将id为偶数的存入到库1中,奇数存入到库2中,在每个库中,再根据学生的...
    99+
    2023-06-22
  • SpringBoot整合Sharding-JDBC实现MySQL8读写分离
    目录一.前言二.项目目录结构三.pom文件四.配置文件(基于YAML)及SQL建表语句五.Mapper.xml文件及Mapper接口六 .Controller及Mocel文件七.结果...
    99+
    2024-04-02
  • SpringBoot2如何整合Sharding-Jdbc中间件实现数据分库分表
    小编给大家分享一下SpringBoot2如何整合Sharding-Jdbc中间件实现数据分库分表,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、水平分割1、水平分库1)、概念:以字段为依据,按照一定策略,将一个库中的数据...
    99+
    2023-06-02
  • springboot实现以代码的方式配置sharding-jdbc水平分表
    目录关于依赖shardingsphere-jdbc-core-spring-boot-startershardingsphere-jdbc-core数据源DataSource原Dat...
    99+
    2024-04-02
  • 使用sharding-jdbc实现水平分库+水平分表的示例代码
    前面的文章使用sharding-jdbc实现水平分表中详细记录了如何使用sharding-jdbc实现水平分表,即根据相应的策略,将一部分数据存入到表1中,一部分数据存入到表2中,...
    99+
    2024-04-02
  • 怎么使用sharding-jdbc实现水平分表
    这篇文章主要介绍“怎么使用sharding-jdbc实现水平分表”,在日常操作中,相信很多人在怎么使用sharding-jdbc实现水平分表问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用shardin...
    99+
    2023-06-25
  • SpringBoot集成Sharding Jdbc使用复合分片的实践
    目录1、Sharing JDBC 简介2、系统改造2.1 对接外部系统的系统2.2 内部系统间的调用3、解决方案4、代码实现4.1 Sharding JDBC 配置4.2 数据源操作...
    99+
    2024-04-02
  • SpringBoot中怎么利用Sharding-JDBC实现MySQL8读写分离
    这篇文章将为大家详细讲解有关SpringBoot中怎么利用Sharding-JDBC实现MySQL8读写分离,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一.前言这是一个基于SpringBo...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作