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

 更新时间:2022年03月01日 09:58:40   作者:Java知识图谱  
本文主要介绍了SpringBoot+MybatisPlus+Mysql+Sharding-JDBC分库分表,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

一、序言

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

本文将基于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分库分表 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java设计模式之模板方法模式Template Method Pattern详解

    Java设计模式之模板方法模式Template Method Pattern详解

    在我们实际开发中,如果一个方法极其复杂时,如果我们将所有的逻辑写在一个方法中,那维护起来就很困难,要替换某些步骤时都要重新写,这样代码的扩展性就很差,当遇到这种情况就要考虑今天的主角——模板方法模式
    2022-11-11
  • Mybatis批量修改的操作代码

    Mybatis批量修改的操作代码

    这篇文章主要介绍了Mybatis批量修改的操作代码,包括整体批量修改的详细代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2017-09-09
  • Elasticsearch写入瓶颈导致skywalking大盘空白

    Elasticsearch写入瓶颈导致skywalking大盘空白

    这篇文章主要为大家介绍了Elasticsearch写入瓶颈导致skywalking大盘空白的解决方案,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • 全面总结java IO体系

    全面总结java IO体系

    这篇文章主要介绍了java IO体系的全面总结,下面和小编来一起学习一下吧
    2019-05-05
  • SpringSecurity实现自定义登录接口的详细过程

    SpringSecurity实现自定义登录接口的详细过程

    本文详细介绍了如何使用SpringSecurity实现自定义登录接口,文章还涉及了对用户实体类的增强以满足详细信息的需求,适合需要深入了解和实现SpringSecurity自定义登录功能的开发者,感兴趣的朋友跟随小编一起看看吧
    2024-10-10
  • 利用Java实现调用http请求

    利用Java实现调用http请求

    在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适。本文就为大家准备了几个java调用http请求的几种常见方式,需要的可以参考一下
    2022-08-08
  • MyBatis Generator配置入门

    MyBatis Generator配置入门

    本文主要介绍了MyBatis Generator配置入门,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Spring Boot 中使用cache缓存的方法

    Spring Boot 中使用cache缓存的方法

    Spring Cache是Spring针对Spring应用,给出的一整套应用缓存解决方案。下面小编给大家带来了Spring Boot 中使用cache缓存的方法,感兴趣的朋友参考下吧
    2018-01-01
  • Java中的常用输入输出语句的操作代码

    Java中的常用输入输出语句的操作代码

    这篇文章主要介绍了Java中的常用输入输出语句的操作代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Java 并行数据处理和性能分析

    Java 并行数据处理和性能分析

    这篇文章主要介绍了Java 并行数据处理和性能分析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10

最新评论