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();

于是就没有出现这个异常情况,至于为什么会产生还没找到原因

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值