mybatis使用PageHelper的bug之第一次缓存后会自己分页

【bug记录】pagehelper分页失效:一次输出所有数据,查询总数错误。 【完美解决】pagehelper分页失效:一次输出所有数据,查询总数错误。 阅读详情

最近遇到一个mybatis一级缓存的问题,使用了pagehelper分页插件,程序频繁执行一个查询sql,数据量大约200条,这个sql没有使用分页,但是在执行大约6次之后,发现这个sql返回的数据变成5条,但是在之后的一段时间里面,再执行的话也没有出现返回5条的情况,经过对pagehelper源码的追踪,我发现这个是缓存导致的。

原来是因为频繁执行一个查询sql,mybatis出于性能考虑,如果一直是全表查询的话,mybatis会去查询全表的数据条数并缓存,然后再去查询分页数据然后返回,问题就在这儿,我程序里面根本没有分页,参数里面也没有传入分页参数,查询返回的对象应该是一个ArrayList对象,结果那一次异常情况返回的是Page对象,是ArrayList的子类,说明pagehelper对查询进行了分页,于是我加上了mybatis的sql打印,发现异常的那次多执行了一次sql,大概是select count(0) from table where 1=1这样。

那次异常的查询中,我发现PageHelper的ThreadLocal里面居然有Page对象,但是我程序没有进行分页,ThreadLocal里面应该是空的才对,不清楚是不是PageHelper的内部bug导致的;

于是我只能在调用查询之前手动调用一次:

PageHelper.clearPage();

于是就没有出现这个异常情况,至于为什么会产生还没找到原因

PageHelper的坑(安全使用方法) 问题的关键就在于,如果在执行了ThreadLocal的set()方法成功了,但是查询等逻辑异常结束了,也就不能被执行remove()方法,那这个线程的ThreadLocal里的变量也就无法被清除,然后该线程不会被清除,而是在线程池中的状态被设置为空闲状态。如果设置了分页,即:使用了PageHelper.startPage(),那么会先运行ThreadLocal变量的set()方法,之后执行查询等逻辑,当查询逻辑正常执行完毕,最后执行ThreadLocal变量的remove()方法,将副本变量删除。 阅读详情

相关推荐

MyBatis + PageHelper 分页查询实战:从集成到深分页优化

分页查询是后端开发中最常见的技术需求之一,其实现方式直接影响接口性能与数据库负载。在Java生态中,MyBatis结合PageHelper是主流的分页解决方案:PageHelper基于MyBatis拦截器机制,通过ThreadLocal传递分页参数,自动改写SQL并生成COUNT语句,实现了分页逻辑与业务查询的解耦。对于复杂动态条件查询,开发者只需调用startPage即可完成分页,同时PageHelper还支持多种数据库方言,降低了多数据库适配成本。然而,分页查询并非没有隐患,深分页导致的性能劣化、Pag

weixin_34416649的博客 216

PageHelper隐藏Bug又深深给我上了一课!

PageHelper隐藏Bug又深深给我上了一课!!!

DongJiYong_20的博客 2181

PageHelper分页原理分析

引言 PageHelper的官方介绍。 如果你也在用 MyBatis,建议尝试该分页插件,这一定是最方便使用的分页插件。 大家理解一下这句话,里面两个含义,第一是要用mybatis,第二分页插件。也说明了,PageHelper是和mybatis深度绑定的,我们后面看源码就能发现。 分页操作 先上代码,看看分页的常规操作。 //获取第1页,10条内容,默认查询总数count PageHelpe...

accp105的博客 695

【Java-Bug】PageHelper.startPage,分页无效

一、前提依赖 1、假设项目使用SpringBoot 2、假设项目使用Maven 3、假设com.github.pagehelper依赖已添加 二、BUG说明 1、有的分页有效,有的分页无效 2、有效-举例: 3、无效-与-修复后对比: 4、原因说明 1)PageHelper.startPage,仅对第一个Mapper查询有效 2)图中,期望是accountRecordService.queryList分页;结果却没有分页 3)原因:refreshConditionWithAcc

hgSuper的博客 1921

MyBatis分页插件PageHelper底层原理与实战优化

在Java后端开发中,分页查询是列表类接口的常见需求。不同数据库方言各异,手写分页代码繁琐且容易出错。MyBatis作为主流持久层框架,通过插件机制为分页这类横切逻辑提供了扩展点。PageHelper正是基于该机制广泛应用的分页插件,它利用MyBatis拦截器和ThreadLocal,在执行SQL前后自动改写分页语句并生成COUNT统计。理解其工作原理,不仅能够帮助开发者避开分页失效、参数串号等典型问题,还能在数据量增长时通过索引优化、COUNT改写、游标分页等手段提升查询性能。本文围绕MyBatis分页的

weixin_33416697的博客 230

一个简单的Springboot+MybatisPlus+PageHelper+Thymeleaf小例子

springboot+mybatis-plus+pagehelper分页插件+thymeleaf的一个小例子,知道他们是什么,集成方式,以及pagehelper分页的实现原理

github_38727595的博客 975

因为一个bug来深入探讨下分页插件PageHelper

事情来源是这样的,因为某些操作失误,在使用分页插件pageHelper时,因为这样一句不起眼的操作,竟然引发了一系列的灾难,下面来看下灾难的由来: Page localPage = PageHelper.startPage(page, limit); 注意参数 page和limit 我的失误呢是因为参数page是0,导致mybatis层在执行sql分页查询的时候,只做了count统计查询总数 ,并没有去执行mapper实际查询语句,也是导致selectList查询语句查询的结果是空,于是我深入了

程序员路同学 1567

别再让分页‘坑’了你的多租户!MybatisPlus中InterceptorIgnore与PageHelper的兼容性实战

本文深入探讨了MybatisPlus在多租户架构下与PageHelper分页插件的兼容性问题,特别是@InterceptorIgnore注解失效的原因及解决方案。通过分析拦截器执行顺序与SQL重写机制的冲突,提供了伪方法补丁、自定义分页拦截器和执行顺序调整三种解决方案,并总结了最佳实践Checklist,帮助开发者避免分页查询中的租户隔离陷阱。

红太阳照大地 397

MyBatis:使用MyBatis执行SQL多出LIMIT ?的问题,MyBatis分页查询SQL自动执行SELECT count(0)的Bug,PageHelper.clearPage()清理缓存

在使用MyBatis执行SQL(包含分页功能)的时候,明明SQL里没写LIMIT,执行时却多出了一个LiMIT。 解决方案:分页查询数据之前先清理分页缓存。 先执行 PageHelper.clearPage(); SQL代码如下:发现SQL中并没有LIMIT。 查询结果仅一页,期望的结果是多页。 查看执行的SQL日志,从控制台中发现SQL中也是没有LIMIT 10,但是为什么在执行中多出了一个LIMIT ?呢?且这个LIMIT的参数就是Parameters的值(我设置的是10)。

qq_43265673的博客 1万+

Spring Boot 3项目里,PageHelper分页插件配置的5个常见坑点与避坑指南

本文深入探讨了Spring Boot 3项目中PageHelper分页插件的5个常见陷阱及解决方案,包括多数据源方言配置、线程安全问题、与MyBatis-Plus的冲突处理、复杂SQL分页失效以及数据泄露风险。通过实际案例和代码示例,帮助开发者有效规避这些坑点,提升分页功能的稳定性和安全性。

weixin_30512043的博客 582

淘淘商城定制版PageHelper分页插件的使用和优化

在数据库查询操作中,分页功能是实现数据展示层用户体验优化的常用手段。PageHelper作为MyBatis框架下的分页插件,为开发者提供了简单易用的分页解决方案。其核心优势在于无需修改原有的SQL语句和MyBatis的映射文件,通过代理方式实现分页查询,大幅降低了分页功能的实现复杂度。PageHelper是一个广泛使用的MyBatis分页插件,它通过简单的配置和方法调用,即可实现数据库的分页查询。然而,随着业务的发展和数据量的增加,原版PageHelper逐渐显示出一些局限性。

weixin_32252929的博客 921

PageHelper分页插件原理与实战:从MyBatis拦截器到高效数据查询

在Java后端开发中,数据库分页是处理大量数据查询的基础技术。其核心原理是通过SQL的LIMIT/OFFSET或ROWNUM等语句,从数据库中按页获取数据子集,同时统计总数以支持分页导航。这项技术能显著提升系统性能与用户体验,避免一次性加载海量数据导致的内存溢出和响应延迟。在MyBatis生态中,分页功能通常借助拦截器机制实现,通过动态改写SQL语句自动添加分页条件。PageHelper作为该领域的代表性工具,极大地简化了开发流程。它通过ThreadLocal存储分页参数,在执行查询时自动触发计数查询与SQ

aoe41606的博客 320

硬件基础(4):(7)ADC电压采集:软件校准(标定、拟合)

在实际项目中,**软件端校准**可以有效弥补硬件方面(分压电阻误差、放大器失调、参考源误差等)带来的系统性偏差,从而提高 ADC 测量精度。下面是一个常见的**多点实测校准**流程与思路,个人感觉传感器标定的原理也只这样。

FCZlll的博客 6246

MyBatis多表查询与分页实战:从原理到深分页优化

在Java后端开发中,MyBatis作为主流持久层框架,多表查询与分页查询是高频实践场景。理解resultMap中association与collection的映射原理,能有效规避一对多查询中数据行数翻倍、映射错乱等典型问题。同时,PageHelper作为物理分页插件,其ThreadLocal机制与SQL改写原理决定了使用边界,稍有不慎便会导致分页失效。针对深分页性能瓶颈,覆盖索引、游标分页与Redis缓存页结果是工程中常用的优化手段。本文从底层原理出发,结合订单列表的多表分页实战,完整呈现从映射配置、N+

weixin_34367257的博客 269

用PyCharm+Scrapy打造你的第一个爬虫:从安装到实战(附完整代码)

本文详细介绍了如何使用PyCharm和Scrapy框架从零开始构建高效网络爬虫。通过环境配置、项目创建、核心爬虫逻辑编写到数据处理与存储的完整流程,帮助Python开发者快速掌握爬虫开发技巧,并附有实战代码示例。特别适合想要学习Scrapy框架和提升爬虫技能的开发者。

weixin_29038345的博客 869

Ansys口腔正畸有限元分析:从几何处理到接触设定的全流程解析

本文详细解析了Ansys在口腔正畸有限元分析中的全流程应用,从几何处理到接触设定,帮助医生精准预测牙齿移动趋势。通过有限元建模技术,可同时观察牙齿-牙周膜-牙槽骨的力学响应,显著提升矫治效果预测准确率。文章还分享了实用技巧和参数设置建议,适用于正畸医生和工程师。

weixin_30897233的博客 348

使用MyBatis执行SQL多出LIMIT ?的问题,MyBatis分页查询SQL自动执行SELECT count(0)的Bug

1.业务场景 ​ 使用easyPoi导出复杂列头,多级表头以及复杂数据以及多sheet表时,解决多个sheet表不同的数据注入时,发现自己自定义的分页没起作用,而且将自己的SQL语句的返回结果改为了COUNT(0)。并且在sql语句之后自动拼接LIMIT并赋值。 2.解决过程 1.将mybatis的日志打印出来,并开启debugger进行跟代码 2.响应的sql执行中的sql语句并不是我自己的语句,感觉是XML中的sql的一对多映射有问题,使用的是 <collection property="the

小七会喷火 5898

告别手动打卡:逍遥模拟器+宥马运动自动跑步脚本配置全流程

本文详细介绍了如何利用逍遥模拟器和自动化脚本实现宥马运动的自动跑步功能,告别手动打卡的繁琐。从环境准备、脚本部署到定位配置和智能调度,全流程指导用户完成自动化设置,提升效率并确保运动数据的真实性。

weixin_42532473的博客 548

PageHelper分页插件深度解析:原理、实战与避坑指南

在Java后端开发中,分页查询是处理大量数据展示的核心技术,其本质是通过SQL的LIMIT和OFFSET等语句实现数据切片。其原理基于数据库的查询优化与结果集截取,旨在提升系统性能与用户体验。这项技术的价值在于简化开发流程、降低内存消耗,并支持高效的数据检索。应用场景广泛,涵盖管理后台、电商列表、社交信息流等需要分批加载数据的系统。本文聚焦于MyBatis分页插件PageHelper,深入探讨其拦截器机制与ThreadLocal实现,并针对复杂查询优化与深分页性能问题提供解决方案,帮助开发者规避常见陷阱,实

weixin_30629653的博客 445

Apollo Planning2.0决策规划算法代码详细解析 (1):环境搭建

1、官方提供连接:git clone https://github.com/ApolloAuto/application-pnc.git。此外,也更新了dreamview对pnc的支持,使得调试更加方便。apollo开源团队近期更新了planning版本,对代码进行了一定程度上的重构。(2)进入docker,并编译整个工程:./apollo.sh build_dbg。下载项目环境后使用aem进行环境配置;2、有一定基础建议直接拉取最新代码,自己手动进行编译。(1)环境安装: ./dev_start.sh。

自动驾驶Player的博客 1841

python全栈入门到实战【基础篇 02】环境搭建:Python解释器与PyCharm、VSCode编辑器安装配置详解

本文详解Python环境搭建步骤。首先安装解释器(运行代码核心),需从官网下载,选3.8及以上版本(勿选2.x)。Windows安装必勾“Add Python.exe to PATH”,验证用`python --version`;Mac选universal2安装包,验证用`python3 --version`。 编辑器二选一:PyCharm社区版(免费,新手推荐),安装后需配置解释器路径;VSCode轻量,需装Python插件并选择解释器。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 5万+

PageHelper自动增加limit产生的数据查询问题

今天线上项目跑着跑着,老是查询不到正确的数据,后面对sql语句进行打印分析,发现有些时候mybatits就算使用了selectByPrimary也会 自动给我加上 limit ,后面查询资料发现,是我 PageHelper.startPage(1, 10); 和mybatits查询代码之间还有别的代码,分页参数和线程是绑定的,如果本次没有去查询数据,该线程去执行别的sql语句时就会自动加上limi...

苏雨丶 5436

uniapp - 实现免费OCR文字识别方案,用户上传图片后进行扫描识别获取图片上的文字,uniApp纯前端做图片OCR识别——无需服务器进行OCR识别插件(不需要依赖任何SDK或第三方API服务)

uniapp实现orc识别免费的插件识别不花钱,无需第三方OCR文字识别API,uniApp拍照或者选择图片免费识别,纯前端不需要服务器,Uniapp提取图片上的文字,本地ocr识别技术,uni-app图片OCR识别文本,uniapp有没有免费的ocr识别组件,uniapp前端实现文字识别,身份证识别,营业执照识别 (兼容APP、H5、小程序 不需要任何SDK)跨端无SDK方案:Uniapp实现OCR文字,离线OCR识别,uniapp tesseract.js实现文字识别,uniapp文字识别无需依赖sdk

🏆 前端领域优质创作者 4251

mybatis分页插件_MyBatis 分页插件 5.2.0 发布

时隔整整8个月,分页插件这次带来了一次大的更新。5.2.0 - 2020-07-26•jsqlparser升级到3.2版本,sql解析更好,对sqlserver支持更好。•修改 sqlserver 方式中的替换正则,现在允许 with( nolock ) 括号中存在空格。•解决 reasonable 和 pageSizeZero,以及 offset 用法中的bug,现在的含义和结果更一致...

weixin_39838798的博客 300

基于Python的彭博社新闻高效爬取实战:最新技术与完整代码解析

本文将详细介绍如何使用Python最新技术构建一个高效的彭博社(Bloomberg)新闻爬虫系统。我们将从爬虫基础概念讲起,逐步深入到高级反反爬技术、异步抓取、数据解析与存储等核心环节。文章包含完整的代码实现,采用最新的aiohttp、Playwright等技术栈,并特别关注法律合规性和数据质量保障。通过本文,读者将掌握一个完整的商业新闻爬虫开发流程,并能够根据实际需求进行定制化开发。关键词:Python爬虫、彭博社、Bloomberg、新闻采集、aiohttp、Playwright、反反爬技术。

2201_76125261的博客 1503

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: 隐藏滚动条使用js实现模拟滚动
下一篇: poi版本3.12以上添加多个批注报错的问题
不恋水的雨
博客等级 码龄10年 95粉丝 106原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值