踩坑系列——PageHelper分页参数未清除导致其他查询报错

文章讲述了线上报出的SQL异常,源于使用PageHelper时,由于未正确清除线程分页参数,导致复用线程时出现意外的分页。作者详细分析了问题发生机制并提供了解决方案:确保在开启分页后立即执行查询,避免参数残留引发错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:

线上报出了一个sql异常,报错语句是这样的:select…from … where … ; limit 10;

分析:

1、定位报错sql语句进行分析

根据报错语句来看是limit前面加了分号导致的,于是根据日志定位到报错语句的mapper,发现代码里的sql确实在最后加了分号,但是这个查询是没有分页的,而实际却莫名其妙给加上了分页参数。

2、PageHelper的分页参数原理

因为项目中的分页使用的PageHelper,这里被加上的分页参数结合自己对PageHelper的了解就想到了大概率是线程中的分页参数没有被清除导致的。分析PageHelper的部分源码如下:

// 项目中使用分页查询的代码
PageHelper.startPage(req.getCurrent(), req.getSize());//开启分页
List<MyResultDTO> data = userRepository.pageList(req);//执行查询

跟踪代码PageHelper.startPage(req.getCurrent(), req.getSize()), 调用的PageMethod部分源码如下:

public abstract class PageMethod {
   
   
	protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal<Page>();
    
    // 开始分页
	public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count, Boolean reasonable, Boolean pageSizeZero) {
   
   
	    Page<E> page = new Page<E>(pageNum, pageSize, count);
	    page.setReasonable(reasonable);
	    page.setPageSizeZero(pageSizeZero);
	    //当已经执行过orderBy的时候
	    Page<E> oldPage = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值