今天在前端走页面的时候,发现有个接口返回的数据偶尔出现一次不是预想的结果。 先看我需要返回的数据: ![](http://img.558idc.com/uploadfile/allimg/boke/2487210-20220615114111249-1114701040.png) 再看
今天在前端走页面的时候,发现有个接口返回的数据偶尔出现一次不是预想的结果。
先看我需要返回的数据:
![](http://img.558idc.com/uploadfile/allimg/boke/2487210-20220615114111249-1114701040.png)再看不是预想中的数据:
![](http://img.558idc.com/uploadfile/allimg/boke/2487210-20220615114221094-1683289310.png)断点调试后发现问题出现在List<Product> products = productBiz.selectListAll();
这个方法上,
正常情况下返回的是全部,偶尔一次返回一个page对象。
products = Page{count=true, pageNum=1, pageSize=3, startRow=0, endRow=3, total=12, pages=4, reasonable=false, pageSizeZero=false}
一开始我以为是二级缓存的原因,于是手动写了一个sql查询语句,将flushCache设置为true。
<select id="selectProducts" resultMap="productMap" flushCache="true">
select * from product;
</select>
这时候多调这个接口的时候,会出现报错的情况,大概意思是在select * from product;LIMIT 3 附近有sql语法错误,但是我原本的sql语句是没有limit的,为什么会突然给我追加一个limit呢。所以这时候我把思绪转向了分页这里。
后面查了资料,发现原因:PageHelper插件是通过ThreadLocal实现分页的,page参数和线程是绑定在一起的,如果在前面其他的接口中page没消费,就会保留在这个线程上,会导致不该分页的方法消费了这个分页参数。
解决办法
在List<Product> products = productBiz.selectListAll();
方法前面加上PageHelper.clearPage();清楚分页参数缓存。
更多方法可参考mybatis执行自定义sql时,多出一个limit