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

相关文章

  • springboot]logback日志框架配置教程

    springboot]logback日志框架配置教程

    这篇文章主要介绍了springboot]logback日志框架配置,logback既可以通过application配置文件进行日志的配置,又可以通过logback-spring.xml进行日志的配置,本文给大家介绍的非常详细,需要的朋友参考下吧
    2022-04-04
  • Springboot Vue实现单点登陆功能示例详解

    Springboot Vue实现单点登陆功能示例详解

    这篇文章主要为大家介绍了Springboot Vue实现单点登陆功能示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • SpringBoot快速整合RabbitMq小案例(使用步骤)

    SpringBoot快速整合RabbitMq小案例(使用步骤)

    这篇文章主要介绍了SpringBoot快速整合RabbitMq小案例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • 实例详解Java实现图片与base64字符串之间的转换

    实例详解Java实现图片与base64字符串之间的转换

    这篇文章主要介绍了Java实现图片与base64字符串之间的转换实例代码,非常不错,具有参考借鉴价值,需要的朋友参考下
    2016-12-12
  • Spring @Profile注解详解

    Spring @Profile注解详解

    这篇文章主要介绍了Spring @Profile注解详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • 深入理解 Java、Kotlin、Go 的线程和协程

    深入理解 Java、Kotlin、Go 的线程和协程

    这篇文章主要介绍了深入理解 Java、Kotlin、Go 的线程和协程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • http basic authentication通过post方式访问api示例分享 basic认证示例

    http basic authentication通过post方式访问api示例分享 basic认证示例

    在HTTP中,基本认证是一种用来允许Web浏览器或其他客户端程序在请求时提供以用户名和口令形式的凭证,这篇文章主要介绍了http basic authentication通过post方式访问api示例,大家参考使用吧
    2014-01-01
  • 在SpringBoot项目中使用Spring Cloud Sentinel实现流量控制

    在SpringBoot项目中使用Spring Cloud Sentinel实现流量控制

    随着微服务架构的流行,服务之间的调用变得越来越频繁和复杂,流量控制是保障系统稳定性的重要手段之一,它可以帮助我们避免因过载而导致的服务不可用,本文将介绍如何在Spring Boot项目中使用Spring Cloud Sentinel来实现流量控制,需要的朋友可以参考下
    2024-08-08
  • 逆波兰计算器(Java实现)

    逆波兰计算器(Java实现)

    这篇文章主要为大家详细介绍了Java实现逆波兰计算器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • Java LinkedHashSet集合的底层原理和TreeSet集合

    Java LinkedHashSet集合的底层原理和TreeSet集合

    LinkedHashSet保证元素有序且唯一,底层通过双链表实现,TreeSet元素不重复且可排序,底层使用红黑树实现排序,自定义类型排序可通过实现Comparable接口或提供Comparator来定义排序规则,适用于需要大量元素快速检索的场景
    2024-10-10

最新评论