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

935

被折叠的 条评论
为什么被折叠?



