返回顶部
首页 > 资讯 > 后端开发 > Python >PageHelper引发的幽灵数据问题解析
  • 669
分享到

PageHelper引发的幽灵数据问题解析

PageHelper幽灵数据PageHelper 数据 2023-05-16 17:05:35 669人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录前言大胆猜测PageHelper工作原理Tomcat请求流程总结前言 最近测试反馈一个问题,某个查询全量信息的接口,有时候返回全量数据,符合预期,但是偶尔又只返回1条数据,简直就

前言

最近测试反馈一个问题,某个查询全量信息的接口,有时候返回全量数据,符合预期,但是偶尔又只返回1条数据,简直就是“见鬼”了,究竟是为什么出现这样的“幽灵数据”呢?

大胆猜测

首先我们看了下这对代码的业务逻辑,非常的简单,总共没有几行代码,也没有分页逻辑,代码如下:

public  List<SdSubscription> findAll() {
    return sdSubscriptionMapper.selectAll();
}

那么究竟是咋回事呢?讲道理不可能出现这种情况的啊,不要慌,我们加点日志,将日志级别调整为DEBUG,让日志飞一段时间。

public  List<SdSubscription> findAll() {
    log.info("find the sub start .....");
    List<SdSubscription> subs = sdSubscriptionMapper.selectAll();
     log.info("find the sub end .....");
    return subs;
}

果不其然,日志中出现了奇奇怪怪的分页参数,如下图所示:

果然是PageHelper这个开源框架搞的鬼,我想大家都用过吧,分页非常方便,那么究竟为什么别人都没问题,单单就我会出现问题呢?

PageHelper工作原理

为了回答上面的疑问,我们先看看PageHelper框架的工作原理吧。

PageHelper 是一个开源的 mybatis 分页插件,它可以帮助开发者在查询数据时,快速的实现分页功能。

PageHelper 的工作原理可以简单概括为以下几个步骤:

  • 在需要进行分页的查询方法前,调用 PageHelper 的静态方法 startPage(),设置当前页码和每页显示的记录数。它会将分页信息放到线程ThreadLocal中,那么在线程的任何地方都可以访问了。
  • 当查询方法执行时,PageHelper 会自动拦截查询语句,如果发现线程的ThreadLocal中有分页信息,那么就会在其前后添加分页语句,例如 Mysql 中的 LIMIT 语句。
  • 查询结果将被包装在 Page 对象中返回,该对象包含分页信息和查询结果列表。
  • 在查询方法执行完毕后,会在finally中清除线程ThreadLocal中的分页信息,避免分页设置对其他查询方法的影响。

PageHelper 的实现原理主要依赖于拦截器技术和反射机制,通过拦截查询语句并动态生成分页语句,实现了简单、高效、通用的分页功能。具体源码在下图的类中,非常容易看懂。

明白了PageHelper的工作原理后,反复检查代码,都没有调用过startPagedebug查看ThreadLocal中也没有分页信息啊,懵逼中。那我看看别人写的添加分页参数的代码吧,不看不知道,一看吓一跳。

原来有位“可爱”的同事竟然在查询后,加了一个分页,就是把分页信息放到线程的ThreadLocal中。

那大家是不是有疑问,丁是丁,矛是矛,你的线程关我何事?这就要说到我们的tomcat了。

Tomcat请求流程

其实这就涉及到我们的tomcat相关知识了,我们一个浏览器发一个接口请求,经过我们的tomcat的,究竟是一个什么样的流程呢?

  • 客户端发送Http请求到Tomcat服务器
  • TomcatHTTP连接器(Connector)接收到请求,将连接请求交给线程池Executor处理,解析它,然后将请求转发给对应的WEB应用程序。
  • Tomcat的Web应用程序容器Container)接收到请求,根据请求的URL找到对应的Servlet

关于tomcat中使用线程池提交浏览器的连接请求的源码如下:

从而得知,你的连接请求是从线程池从拿的,而拿到的这个线程恰好是一个“脏线程”,在ThreadLocal中放了分页信息,导致你这边出现问题。

总结

后来追问了同事具体原因,才发现是粗心导致的。有些bug总是出现的莫名其妙,就像生活一样。所以关键的是我们在使用一些开源框架的时候一定要掌握底层实现的原理、核心的机制,这样才能够在解决一些问题的时候有据可循。

以上就是PageHelper引发的幽灵数据问题解析的详细内容,更多关于PageHelper幽灵数据的资料请关注编程网其它相关文章!

--结束END--

本文标题: PageHelper引发的幽灵数据问题解析

本文链接: https://lsjlt.com/news/210364.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • PageHelper引发的幽灵数据问题解析
    目录前言大胆猜测PageHelper工作原理Tomcat请求流程总结前言 最近测试反馈一个问题,某个查询全量信息的接口,有时候返回全量数据,符合预期,但是偶尔又只返回1条数据,简直就...
    99+
    2023-05-16
    PageHelper幽灵数据 PageHelper 数据
  • 全面解析Java中的GC与幽灵引用
    Java 中一共有 4 种类型的引用 : StrongReference、 SoftReference、 WeakReference 以及 PhantomReference (传说中...
    99+
    2022-11-15
    Java GC
  • 探索 VUE Nuxt.js 路由世界的幽灵:解决常见问题
    确保您已正确配置 router.js 中的路由规则。 检查服务器是否已正确设置以提供正确的静态文件。 确认您已在 nuxt.config.js 中正确设置了 build.publicPath。 2. vue-router 导航警告:未...
    99+
    2024-04-02
  • 如何解析针对distinct疑问引发的问题
    如何解析针对distinct疑问引发的问题,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。有人提出了这样一个问题,整理出来给大家也参考一下假...
    99+
    2024-04-02
  • SpringMVC解析JSON请求数据问题解析
    这几年都在搞前后端分离、RESTful风格,我们项目中也在这样用。前几天有人遇到了解析JSON格式的请求数据的问题,然后说了一下解析的方式,今天就写篇文章简单的分析一下后台对于JSON格式请求数据是怎么解析的。先把例子的代码贴出来:前端&l...
    99+
    2023-05-31
    spring mvc json
  • springbootmybatis调用多个数据源引发的错误问题
    目录springboot mybatis调用多个数据源错误报错解决方法springboot-mybatis多数据源及踩坑springboot项目结构如下springboot配置文件内...
    99+
    2024-04-02
  • 记一次将测试数据库的数据清空,执行truncate引发ORA-02266的问题分析
    原文: https://www.enmotech.com/web/detail/1/760/1.html   (复制链接,打开浏览器即可查看)  文章转载...
    99+
    2024-04-02
  • JS语法中由 ++[[]][+[]]+[+[]] = 10引发的问题分析
    本篇内容主要讲解“JS语法中由 ++[[]][+[]]+[+[]] = 10引发的问题分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS语法中由 ++[[]...
    99+
    2024-04-02
  • Presto自定义函数@SqlNullable引发问题详解
    目录引发Presto问题错误具体内容修改UDF源码引发Presto问题 看到标题我们会想到是由于@SqlNullable注解引发的问题,我们先看一段代码,正是这段有意思的代码,让我...
    99+
    2022-12-08
    Presto自定义函数@SqlNullable Presto SqlNullable
  • 关于HashMap 并发时会引起死循环的问题解析
    今天研读Java并发容器和框架时,看到为什么要使用ConcurrentHashMap时,其中有一个原因是:线程不安全的HashMap, HashMap在并发执行put操作时会引起死循...
    99+
    2024-04-02
  • MySQL MVCC 原理分析:如何解决数据并发问题?
    MySQL MVCC 原理分析:如何解决数据并发问题?在数据库系统中,数据并发问题是一个非常重要且常见的挑战。在多个用户同时对数据库进行读写操作时,会出现数据不一致、丢失更新等问题。为了解决这些问题,MySQL引入了MVCC(多版本并发控制...
    99+
    2023-10-22
    MySQL mvcc 并发问题解决
  • 如何解决springboot mybatis调用多个数据源引发的错误问题
    这篇文章给大家分享的是有关如何解决springboot mybatis调用多个数据源引发的错误问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。springboot mybatis调用多个数据源错误报错...
    99+
    2023-06-26
  • python未解析的引用问题怎么解决
    Python未解析的引用问题可能有多种原因,以下是一些常见的解决方法: 检查引用的模块是否已经安装:如果使用的是第三方模块,可以...
    99+
    2023-10-25
    python
  • MySQL 8.0 timestamp引发的问题怎么解决
    本篇内容介绍了“MySQL 8.0 timestamp引发的问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能...
    99+
    2024-04-02
  • 如何解决因@click.stop引发的bug问题
    这篇文章将为大家详细讲解有关如何解决因@click.stop引发的bug问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。问题在项目页面中使用 element popov...
    99+
    2024-04-02
  • 解决SecureRandom.getInstanceStrong()引发的线程阻塞问题
    目录1. 背景介绍2. 现象展示2.1 windows7下运行结果2.2 centos7下运行结果3. 现象分析3.1 linux阻塞分析3.2 windows下运行结果分析4. 结...
    99+
    2024-04-02
  • 数据库中模糊查询索引问题的示例分析
    这篇文章将为大家详细讲解有关数据库中模糊查询索引问题的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 1、问题描述:  &...
    99+
    2024-04-02
  • 如何解决SQLServer2008数据引擎连接问题
    这篇文章将为大家详细讲解有关如何解决SQLServer2008数据引擎连接问题,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。当 SQL Server 数据库...
    99+
    2024-04-02
  • python中使用icalendar解析vDDDTypes数据的问题
    问题内容 正如您从以下内容中可能了解到的那样,我不是一个非常熟练的程序员。尽管如此,我正在尝试编写一个python程序,用于从icalendar格式的文件导入数据并将其存储在数据库中。...
    99+
    2024-02-13
    python程序
  • 数据库中创建数据对象时加双引号存在的问题分析
    本篇内容介绍了“数据库中创建数据对象时加双引号存在的问题分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作