PageHelper 导致 SQL莫名分页的问题处理

博客讲述了在Java开发中遇到的一个诡异bug,即SQL莫名进行分页查询,导致数据错误。问题源于PageHelper分页插件的使用不当,由于PageHelper借助ThreadLocal实现分页,当线程复用时,前一次请求的分页信息会影响到后续请求。解决方案是在过滤器中添加PageHelper.clearPage()来清除历史线程中的分页数据。强调了正确使用PageHelper的重要性,避免混乱使用引发问题。

今天在改代码时遇到一个很诡异的bug,查询数据会几率性的报错,sql会莫名其妙的分页,
后台的业务方法没有添加
PageHelper.startPage(pageNo, pageSize);

然后在网上看了一下也有类似的问题,分页sql类似下面的

 SELECT * FROM (  SELECT TMP_PAGE.*, ROWNUM ROW_ID FROM (
 select TEST_SEQ.nextval from dual
 ) TMP_PAGE) WHERE ROW_ID <= ? AND ROW_ID > ?

经过排查,该SQL的方法不可能存在分页的逻辑。
故怀疑是PageHelper 的使用,导致的SQL错误。

PageHelper是借助ThreadLocal实现分页功能的。Tomcat 使用的是线程池技术来处理HTTP的请求,当一个请求信息处理完毕后,该线程将被返回到线程池中。下一个请求来,继续从线程池中获取线程来处理。如果放回线程池中的线程的ThreadLocal 存在垃圾数据,那么这个垃圾数据将会对新的请求造成影响。

根据这个思路我去看了一下我自己的业务代码,发现,确实是这样的,
我的页面有一个标包表格,它先去请求了一次后台,由于这个是有分页的,所以就影响到了此页面的下一个请求,导致下一个请求直接报错了。

问题的解决:
 添加filter,利用PageHelper.clearPage(), 清楚掉历史线程中的垃圾信息。
 
造成问题的原因:
 部分使用PageHelper 没有使用好,应该严格按照 一个PageHelper.startPage
 接着一个Mapper的查询。如果混乱的使用PageHelper就会导致以上问题。

原文链接:https://www.codenong.com/cs106265884

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值