最近遇到一个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();
于是就没有出现这个异常情况,至于为什么会产生还没找到原因