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

今天在改代码时遇到一个很诡异的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

你可能感兴趣的:(mybatis,sql,java,数据库)