欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2022年03月01日 09:58:40   作者:Java知識圖譜  
本文主要介紹了SpringBoot+MybatisPlus+Mysql+Sharding-JDBC分庫分表,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、序言

在實際業(yè)務中,單表數據增長較快,很容易達到數據瓶頸,比如單表百萬級別數據量。當數據量繼續(xù)增長時,數據的查詢性能即使有索引的幫助下也不盡如意,這時可以引入數據分庫分表技術。

本文將基于SpringBoot+MybatisPlus+Sharding-JDBC+Mysql實現(xiàn)企業(yè)級分庫分表。

1、組件及版本選擇

  • SpringBoot 2.6.x
  • MybatisPlus 3.5.0
  • Sharding-JDBC 4.1.1
  • Mysql 5.7.35

2、預期目標

  • 使用上述組件實現(xiàn)分庫分表,簡化起見只討論分表技術
  • 完成分表后的邏輯表與物理表間的增刪查改
  • 引入邏輯刪除和使用MybatisPlus內置分頁技術

完整項目源碼訪問地址。

二、代碼實現(xiàn)

為了簡化分表復雜性,專注于分表整體實現(xiàn),簡化分表邏輯:按照UserId的奇偶屬性分別進行分表。以訂單表這一典型場景為例,一般來說有關訂單表,通常具有如下共性行為:

  • 創(chuàng)建訂單記錄
  • 查詢XX用戶的訂單列表
  • 查詢XX用戶的訂單列表(分頁)
  • 查詢XX訂單詳情
  • 修改訂單狀態(tài)
  • 刪除訂單(邏輯刪除)

接下來通過代碼實現(xiàn)上述目標。

(一)素材準備

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、修改數據

修改數據一般涉及部分列,比如修改訂單表的訂單狀態(tài)等。

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

三、理論分析

1、選擇分片列

選擇分片列是經過精心對比后確定的,對于訂單類場景,需要頻繁以用戶ID為查詢條件篩選數據,因此將同一個用戶的訂單數據存放在一起有利于提高查詢效率。

2、擴容

當分表后的表數據快速增長,可以預見即將達到瓶頸時,需要對分表進行擴容,擴容以2倍的速率進行,擴容期間需要遷移數據,工作量相對可控。

到此這篇關于SpringBoot+MybatisPlus+Mysql+Sharding-JDBC分庫分表 的文章就介紹到這了,更多相關SpringBoot分庫分表 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot中多環(huán)境啟動配置的教程詳解

    SpringBoot中多環(huán)境啟動配置的教程詳解

    在SpringBoot項目的生命周期中,存在不同的環(huán)境,我們就需要針對不同環(huán)境制定不同名稱的配置文件,里面放置不同環(huán)境下所需的配置項,下面小編就來和大家詳細講講SpringBoot如何進行多環(huán)境啟動配置的吧
    2024-02-02
  • 一文帶你你搞懂Java的3種IO模型

    一文帶你你搞懂Java的3種IO模型

    在Java中,一共有三種IO模型,分別是阻塞IO(BIO)、非阻塞IO(NIO)和異步IO(AIO),本文將給大家詳解的介紹這三種IO模型,文中有相關的代碼示例,需要的朋友可以參考下
    2023-05-05
  • 分析JVM的執(zhí)行子系統(tǒng)

    分析JVM的執(zhí)行子系統(tǒng)

    本文主要介紹了JVM執(zhí)行子系統(tǒng)。了解虛擬機是如何執(zhí)行程序的, 虛擬機怎樣運行一個Class文件的概念模型, 可以更好的理解怎樣寫出優(yōu)秀的代碼
    2021-06-06
  • 詳解SpringBoot中的統(tǒng)一異常處理

    詳解SpringBoot中的統(tǒng)一異常處理

    這篇文章主要介紹了詳解SpringBoot中的統(tǒng)一異常處理,在獨立的某個地方,比如單獨一個類,定義一套對各種異常的處理機制,需要的朋友可以參考下
    2023-05-05
  • 詳解MyBatis工作原理

    詳解MyBatis工作原理

    近來想寫一個mybatis的分頁插件,但是在寫插件之前肯定要了解一下mybatis具體的工作原理吧,本文就詳細總結了MyBatis工作原理,,需要的朋友可以參考下
    2021-05-05
  • java如何判斷一個數是否是素數(質數)

    java如何判斷一個數是否是素數(質數)

    這篇文章主要介紹了java如何判斷一個數是否是素數(質數),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java插入修改刪除數據庫數據的基本方法

    Java插入修改刪除數據庫數據的基本方法

    這篇文章主要介紹了Java插入修改刪除數據庫數據的基本方法,是Java入門學習中的基礎知識,需要的朋友可以參考下
    2015-10-10
  • Java之NoClassDefFoundError的原因及分析

    Java之NoClassDefFoundError的原因及分析

    在Java開發(fā)中,經常會遇到ClassNotFoundException和NoClassDefFoundError異常,ClassNotFoundException發(fā)生在編譯時JVM無法找到類,而NoClassDefFoundError則發(fā)生在運行時JVM無法加載類,這兩個異常雖然原因相似,但有本質區(qū)別
    2024-09-09
  • 使用Java實現(xiàn)在Excel中創(chuàng)建下拉列表

    使用Java實現(xiàn)在Excel中創(chuàng)建下拉列表

    下拉列表(下拉框)可以確保用戶僅從預先給定的選項中進行選擇,這樣不僅能減少數據輸入錯誤,還能節(jié)省時間提高效率,下面我們就來看看如何在java中利用免費庫實現(xiàn)創(chuàng)建下拉列表吧
    2024-03-03
  • SpringBoot整合Redisson實現(xiàn)分布式鎖

    SpringBoot整合Redisson實現(xiàn)分布式鎖

    本文主要介紹了SpringBoot整合Redisson實現(xiàn)分布式鎖,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評論