首页 > 其他分享 >分页合理化是什么?

分页合理化是什么?

时间:2023-12-25 21:00:30浏览次数:24  
标签:分页 页码 什么 合理化 数据 BUG 请求

一、前言

大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

只要是干过后台系统的同学应该都做过分页查询吧,前端发送带有页码(pageNum)和每页显示数量(pageSize)的请求,后端根据这些参数来提取并返回相应的数据集。在SpringBoot框架中,经常会使用Mybatis+PageHelper的方式实现这个功能。

但大家可能对分页合理化这个词有点儿陌生,不过应该都遇到过因为它产生的问题。这些问题不会触发明显的错误,所以大家一般都忽视了这个问题。那么啥是分页合理化,我来举几个例子:

它的定义:分页合理化通常是指后端在处理分页请求时会自动校正不合理的分页参数,以确保用户始终收到有效的数据响应。

1. 请求页码超出范围:

假设数据库中有100条记录,每页展示10条,那么就应该只有10页数据。如果用户请求第11页,不合理化处理可能会返回一个空的数据集,告诉用户没有更多数据。开启分页合理化后,系统可能会返回第10页的数据(即最后一页的数据),而不是一个空集。

2. 请求页码小于1:

用户请求的页码如果是0或负数,这在分页上下文中是没有意义的。开启分页合理化后,系统会将这种请求的页码调整为1,返回第一页的数据。

3. 请求的数据大小小于1:

如果用户请求的数据大小为0或负数,这也是无效的,因为它意味着用户不希望获取任何数据。开启分页合理化后,系统可能会设置一个默认的页面大小,比如每页显示10条数据。

4. 请求的数据大小不合理:

如果用户请求的数据大小非常大,比如一次请求1000条数据,这可能会给服务器带来不必要的压力。开启分页合理化后,系统可能会限制页面大小的上限,比如最多只允许每页显示100条数据。

二、为啥要设置分页合理化?

其实上面那些问题对于后端来讲很合理,页码和页大小设置不正确查询不出来值难道不合理吗?唯一的问题就是如果一次性查询太多条数据服务器压力确实大,但如果是产品要求的那也没办法呀!
真正让我不得不解决这个问题的原因是前端的一个BUG,这个BUG是啥样的呢?我来给大家描述一下。

1. BUG复现

我们先看看前端的分页组件

前端的这个分页组件大家应该很常见,它需要两个参数:总行数、每页行数。比如说现在总条数是6条,每页展示5条,那么会有2页,没啥问题对吧。

那么,现在我问一个问题:我们切换到第二页,把第二页仅剩的一条数据给删除掉,会出现什么情况?

理想情况:页码自动切换到第1页,并查询第一页的数据;
真实情况:页码切换到了第1页,但是查询不到数据,这明显就是一个BUG!

2. BUG分析

1. 用户切换到第二页,前端发起了请求,如:http://localhost:8080/user/pageQuery?pageNum=2&pageSize=5 ,此时第2页有一条数据;

2. 用户删除第2页的唯一数据后,前端发起查询请求,但还是第2页的查询,因为总数据的变化前端只能通过下一次的查询才能知道,但此时数据查询为空;

3. 虽然第二次查询的数据集为空,但是总条数已经变化了,只剩下5条,前端分页组件根据计算得出只剩下一页,所以自动切换到第1页;

可以看出这个BUG是分页查询的一个临界状态产生的,必现、中低频,属于必须修复的那一类。不过这个BUG想甩给前端,估计不行,因为总条数的变化只有后端知道,必须得后端修了。

三、设置分页合理化

咋一听这个BUG有点儿复杂,但如果你使用的是PageHelper框架,那么修复它非常简单,只需要两行配置
application.ymlapplication.properties中添加

pagehelper.helper-dialect=mysql
pagehelper.reasonable=true

只要加了这两行配置,这个BUG就能解决。因为配置是全局的,如果你只想对单个查询场景生效,那就在设置分页参数的时候,加一个参数,如下:

PageHelper.startPage(pageNumber, pageSize, true);

四、分页合理化配置的原理说明

这个BUG如果要自己解决的话,是不是感觉有点头痛了,但是人家PageHelper早就想到这个问题了,就像游戏开挂一样,一个配置就解决了这个麻烦的问题。
用的时候确实很爽,但是我却有点担心,这个配置现在解决了这个BUG,会不会导致新的BUG呢?如果真的出现了新BUG,我应该怎么做呢?所以我决定研究一下它的基础原理。

在com.github.pagehelper.Page类下,找到了这段核心源码,这段应该就是分页合理化的实现逻辑

// 省略其他代码
public Page<E> setReasonable(Boolean reasonable) {
  if (reasonable == null) {
    return this;
  }
  this.reasonable = reasonable;
  //分页合理化,针对不合理的页码自动处理
  if (this.reasonable && this.pageNum <= 0) {
     this.pageNum = 1;
     calculateStartAndEndRow();
   }
   return this;
}
// 省略其他代码

// 省略其他代码
/**
 * 计算起止行号
*/
private void calculateStartAndEndRow() {
    this.startRow = this.pageNum > 0 ? (this.pageNum - 1) * this.pageSize : 0;
    this.endRow = this.startRow + this.pageSize * (this.pageNum > 0 ? 1 : 0);
}
// 省略其他代码

还有一些代码我没贴,比如PageInterceptor#intercept方法,这里我整理了一下它的执行流程图,如下:

看了图解,这套配置还挺清晰的,懂了怎么回事儿,用起来也就放心了。记得刚开始写代码时,啥都希望有人给弄好了,最好是拿来即用。但时间一长,自己修过一堆BUG,才发现只有自己弄明白的代码才靠谱,什么都想亲手来。等真正搞懂了一些底层的东西,才意识到要想造出好东西,得先学会站在巨人的肩膀上。学习嘛,没个头儿!

标签:分页,页码,什么,合理化,数据,BUG,请求
From: https://www.cnblogs.com/wlovet/p/17926629.html

相关文章

  • 1.Linux是什么与如何学习
    第1章Linux是什么与如何学习历史部分略过。1.2.5Linux的内核版本Linux的内核版本编号有点类似如下的样子:3.10.0-123.el7.x86_64主版本.次版本.发布版本-修改版本虽然编号就是如上的方式来编的,不过依据Linux内核的发展期程,内核版本的定义有点不太相同奇数、偶数版......
  • 什么是蓝牙信标?
    蓝牙信标IBeacon是一款采用低功耗蓝牙BLE(Bluetooth4.0或更高版本)广播协议的硬件设备,它兼容IBeacon协议和Eddystone。作为一款BLE设备,它通常被安装在室内的特定位置,作为室内位置的基准点,不断向周围进行连续广播,无需与任何主机设备连接,只需要等待主机设备进行扫描和解析。它就像是一......
  • Python中的变量是什么?数据类型又有哪些?
    Python语言的基础构成要素:变量与数据类型。因为不仅是Python,变量与数据类型可以说是所有编程语言的核心。掌握了语言的变量与数据类型的体系,可以说就掌握了这门语言的一大半儿。1、什么是变量我们都知道应用程序在运行阶段的数据存放在内存中,那实现应用程序的编程语言是怎么操......
  • 为什么员工都非常抵触「绩效考核」,该怎么办呢?
    员工抵制绩效考核的原因可能有很多,其中一些常见的原因包括:考核方式不公正:如果考核方式不够客观、公正,或者与员工的实际工作情况不符,员工就会对绩效考核产生不信任感,从而产生抵触情绪。工作压力增大:绩效考核往往与员工的晋升、薪酬等方面挂钩,如果因此给员工带来更大的工作压力,员......
  • 华纳云云服务器2核4g能干什么?
     对于许多个人和企业来说,云服务器的硬件配置是至关重要的。其中,常见的有2核4G配置。 谈到2核4g配置,它是指云服务器拥有2个CPU核心和4GB的内存。2核指的是处理器(CPU)的核心数量,而4G则是指内存的大小。这个配置通常对于中小型网站应用和简单计算应用来说已经足够。它的优势在......
  • EasyCVR点击通道后页面分页不显示是什么原因?如何解决?
    有用户反馈,EasyCVR在点击当前通道列表分页后,再点击其他设备时,页面不加载任何通道,如下对比:经过技术人员排查后发现,原因是重新点击设备时,带了之前的分页数据,才导致页面没有数据;查看代码发现,设备编码变更时,没有重置分页参数;于是新增重置分页参数代码,即可解决该问题。......
  • Python 爬虫在数据分析方面有什么潜力
    在当今信息爆炸的时代,大量的数据被生成和存储,这给企业、学术界和个人提供了巨大的机会和挑战。爬虫作为一种数据获取的技术手段,可以帮助我们从互联网上获取大量的数据。结合数据分析技术,爬虫在数据分析方面具有巨大的潜力。本文将介绍一些爬虫在数据分析方面的潜力和应用场景。1.获......
  • 智能监控平台/视频共享融合系统EasyCVR点击通道后页面分页不显示是什么原因?如何解决?
    TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力,也具备接入AI智能分析的能力,包括对人、车、......
  • wpf + MaterialDesign + Prism8 + DataGrid 实现表格数据+分页
    十年河东,十年河西,莫欺少年穷学完止境,精益求精1、不分页,带有排序功能(每个字段都可以排序) xaml如下:<UserControlx:Class="WpfApp.UserControls.UserView"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http:......
  • 首个离散元仿真软件EDEM好学吗?有什么学习技巧?
    EDEM是一款首个离散元仿真软件,它被广泛应用于工程领域,特别是在颗粒材料的模拟和分析方面。对于初学者来说,EDEM可能会有一定的学习曲线,但是只要掌握了一些学习技巧,就能够很快上手并熟练运用这款软件。首先,对于初学者来说,最重要的是要了解EDEM软件的基本原理和功能。可以通过阅读E......