注:
大家好我是妈妈的好大儿,
笔者联系方式
QQ:3302254385
微信:yxc3302254385
交个朋友!
创作不易,三连十分感谢!!!,
线上问题:
由于近期有一个重推物流信息的刷数据需求,在实际生产过程中发生多次oom导致服务down机,最后通过skyWalKing排查原因发现是因为全表扫描导致的问题!
最终定位到具体的代码 见下
LopWrapDistribution distribution = new LopWrapDistribution();
distribution.setWrapNo(wrapNo);
List<LopWrapDistribution> distributionList = distributionMapper.select(distribution);
由于wrapNo为空导致wrap_no条件不生效,导致最后的查询语句变成,见下,导致全表扫描
SELECT * FROM lop_wrap_distribution
本应该是
SELECT * FROM lop_wrap_distribution where wrap_no = #{?}
对于数据量特别大的表,这是一个特别特别严重切无法容忍的问题,不单单会导致服务oom,也会导致占用mysql的性能
问题原因解析
先看一下tk.mybatis所使用的版本
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>3.3.6</version>
</dependency>
然后我们去看一下tkmapper在底层是怎么构建你的查询语句
首先是第一层,我们的抽象接口
/**
* 通用Mapper接口,查询
*
* @param <T> 不能为空
* @author liuzh
*/