收到告警应用服务频繁重启,查看监控,发现应用频繁fullGC
找运维拿下dump文件后MAT分析
(路径:阿里云盘/IT/产线问题积累/OOM/queryPurchaseHeader_without_SheetIdParam.hprof)
发现这个http请求线程下有很多mysql相关的ByteArrayRow对象(100487个) ,推测是db查询返回数据量太多的缘故.
继续往下找相关查询sql
这是一张明细表,表里有上百万的数据,可为什么会没带查询条件呢?
查看查询对象属性,发现sheetId和sheetIdList都为空.
看了这个接口的使用场景,是根据单据号查询明细的接口,按理说sheetId和sheetIdList不可能都为空.
查看view层转发过来的参数
发现很多view层带过来的参数都没有sheetId,导致中台服务查询时没带参数查了全表数据.
后续让前端排查什么样的场景下会不传sheetId过来.同时后端这边增加相关的参数非空校验.
TIPS:后续关于后端相关接口还是要做好入参必传校验,血泪史