mybatisplus sharding jdbc 数据源,springboot mysql分库分表

  mybatisplus sharding jdbc 数据源,springboot mysql分库分表

  00-1010 I前言1、组件和版本选择2、预期目标2、代码实现1、材料准备1、实体类2、映射器类3、全局配置文件2、增删改1、保存数据2、查询列表数据3、分页查询数据4、查询明细5、删除数据6、修改数据3、理论分析1、选择分段列。

  00-1010在实际业务中,单个表的数据增长很快,很容易达到数据瓶颈,比如单个表的数据量以百万计。当数据量持续增长时,即使有索引的帮助,数据的查询性能也不尽如人意。这时可以引入数据数据库和表格的技术。

  本文将基于Spring Boot MyBatisplus Harding-JDBC MySQL实现企业级子数据库和子表。

  

目录

spring boot 2.6 . xmybatisplus 3 . 5 . 0 sharding-JDBC 4 . 1 . 1 MySQL 5 . 7 . 35

 

  00-1010以上组件用于实现数据库和表的分离。为简单起见,只讨论表分离技术。完成表分离后逻辑表和物理表之间的添加、删除、检查和改变。引入逻辑删除,利用MybatisPlus内置分页技术完成项目源代码访问地址。

  00-1010为了简化表拆分的复杂度,重点介绍表拆分的整体实现,简化表拆分逻辑:根据UserId的奇偶属性进行表拆分。以订单的典型场景为例。一般来说,订单通常有以下常见行为:

  创建订单记录,查询XX用户订单列表,查询XX用户订单列表(分页),查询XX订单明细,修改订单状态,删除订单(逻辑删除),然后通过代码实现上述目标。

  

一、序言

 

  

1、组件及版本选择

@ Data @ TableName( bu _ Order )公共类Order { @ TableId private Long orderId;私有整数orderType私有长userId私人双倍金额;私有整数orderStatus@TableLogic @JsonIgnore私有布尔值已删除;}

 

  

2、预期目标

@ mapper公共接口OrderMapper扩展BaseMapperOrder {}

 

  

二、代码实现

spring : config : use-legacy-processing : true shardingsphere : data source : ds 1: Driver-class-name : com . MySQL . CJ . JDBC . Driver type : com . Alibaba . druid . pool . druid data source URL : JDBC 3: MySQL ://127 . 0 . 0 . 0 . 127 . 0server time zone=UTC username : root password : 123456 names : DS1 props : SQL : show : true sharing : tables : bu _ order : AC tual-data-nodes 3360 DS1 . bu _ order _ $-{ 0.1}密钥生成器:列: order_id类型:雪花表-策略:内联:算法-表达式: bu_order_${user_id%2}分片-列: user_id

 

  

(一)素材准备

 

  00-1010由于原表是按照主键的奇偶属性划分的,所以划分后每个表的数据量是划分前的一半。

  一。根据需要也可以自定义分表数量(比如10张),新分表后的数据量是不分表前的十分之一。

  

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

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: