mybatis使用PageHelper的bug之第一次缓存后会自己分页
最近遇到一个mybatis一级缓存的问题,使用了pagehelper分页插件,程序频繁执行一个查询sql,数据量大约200条,这个sql没有使用分页,但是在执行大约6次之后,发现这个sql返回的数据变成5条,但是在之后的一段时间里面,再执行的话也没有出现返回5条的情况,经过对pagehelper源码的追踪,我发现这个是缓存导致的。
原来是因为频繁执行一个查询sql,mybatis出于性能考虑,如果一直是全表查询的话,mybatis会去查询全表的数据条数并缓存,然后再去查询分页数据然后返回,问题就在这儿,我程序里面根本没有分页,参数里面也没有传入分页参数,查询返回的对象应该是一个ArrayList对象,结果那一次异常情况返回的是Page对象,是ArrayList的子类,说明pagehelper对查询进行了分页,于是我加上了mybatis的sql打印,发现异常的那次多执行了一次sql,大概是select count(0) from table where 1=1这样。
那次异常的查询中,我发现PageHelper的ThreadLocal里面居然有Page对象,但是我程序没有进行分页,ThreadLocal里面应该是空的才对,不清楚是不是PageHelper的内部bug导致的;
于是我只能在调用查询之前手动调用一次:
PageHelper.clearPage();
于是就没有出现这个异常情况,至于为什么会产生还没找到原因
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)