pagehelper分页乱套问题如何解决(pagehelper,开发技术)

时间:2024-03-29 15:07:22 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

    pagehelper%E5%88%86%E9%A1%B5%E4%B9%B1%E5%A5%97%E9%97%AE%E9%A2%98%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3

希望大家仔细阅读,能够学有所成!

现象是这样的:我们有一个场景是查询数据库表中的全量记录返回给第三方,但是突然某一天发现第三方告警说我们给的数据不对了,比如之前会给到200条记录的,某次只给到了10条记录。

随后我们推出了几个猜想:

1. 第三方系统处理数据有bug,漏掉了一些数据;

2. 数据库被人临时改掉过,然后又被复原了;

3. 数据库bug,在全量select时可能不返回全部记录;

其实以上猜想都显得有点无厘头,比如数据库怎么可能有这种低级bug?但是人在没有办法的情况下只能胡猜一通了。最后终于发现是pagehelper的原因,因为分页乱套了,复用了其他场景下的分页设置,丢到数据库查询后返回了10条记录;

本身pagehelper就是一个辅助工具类,所以使用起来一般很简单。尤其在springboot中,只要引用starter类,依赖就可以满足了。(如果是其他版本,则可能需要配置下mybatis的intercepter)

在使用时只需要加上 Page.startPage(pageNum, pageSize) 即可。

而真正的sql里只需按没有分页的样式写一下就可以了。

还是很易用的。少去了一些写死的sql样例。

pagehelper不是什么高深的组件,实际上它就是一个mybatis的一个插件或者拦截器。是mybatis在执行调用时,将请求转发给pagehelper处理,然后由pagehelper包装分页逻辑。

如果没有分页逻辑需要处理,和普通的没什么差别,如果有分页请求,则会在原来的sql之上套上limit.. offset.. 之类的关键词。从而完成分页效果。

现在我们来说说为什么分页会乱套?原因是 PageHelper.startPage(xx) 的原理是将分页信息设置到线程上下文中,然后在随后的查询中使用该值,使用完成后就将该信息清除。

那么什么情况下会导致分页信息乱套呢?实际上就是线程变量什么情况会被乱用呢?

线程被复用的时候,将可能导致该问题。比如某个请求将某个线程设置了一个线程变量,然后随后另一个请求复用了该线程,那么这个变量就被复用过去了。那么什么情况下线程会被复用呢?

一般是线程池、连接池等等。是的,大概就是这么原理了。

既然从理论上说明了这个问题,能否稳定复现呢?咱们编写下面的,很快就复现了。

验证步骤及结果如下:(数据方面,自己随便找一些表就好了)

// 步骤1: 发送请求: http://localhost:8081/hello/getUsers?pageNum=1&pageSize=1
// 步骤2: 发送请求: http://localhost:8081/hello/getAllActors
// 正常时返回
[{"actorId":1,"firstName":"PENELOPE","lastName":null,"lastUpdate":null},{"actorId":2,"firstName":"NICK","lastName":null,"lastUpdate":null},{"actorId":3,"firstName":"ED","lastName":null,"lastUpdate":null},{"actorId":4,"firstName":"JENNIFER","lastName":null,"lastUpdate":null},{"actorId":5,"firstName":"JOHNNY","lastName":null,"lastUpdate":null},{"actorId":6,"firstName":"BETTE","lastName":null,"lastUpdate":null},{"actorId":7,"firstName":"GRACE","lastName":null,"lastUpdate":null},{"actorId":8,"firstName":"MATTHEW","lastName":null,"lastUpdate":null},{"actorId":9,"firstName":"JOE","lastName":null,"lastUpdate":null},{"actorId":10,"firstName":"CHRISTIAN","lastName":null,"lastUpdate":null},{"actorId":11,"firstName":"ZERO","lastName":null,"lastUpdate":null},{"actorId":12,"firstName":"KARL","lastName":null,"lastUpdate":null},{"actorId":13,"firstName":"UMA","lastName":null,"lastUpdate":null},{"actorId":14,"firstName":"VIVIEN","lastName":null,"lastUpdate":null},{"actorId":15,"firstName":"CUBA","lastName":null,"lastUpdate":null},{"actorId":16,"firstName":"FRED","lastName":null,"lastUpdate":null},...
// 出异常时返回
[{"actorId":1,"firstName":"PENELOPE","lastName":null,"lastUpdate":null}]

本文:pagehelper分页乱套问题如何解决的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:golang.org不能访问如何解决下一篇:

1 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18