网站建设方案评标原则,免费学校网站建设,工商网站查询企业信息官网,建设厅证件查询系统问题截图#xff1a; 由于作者使用递归统计信息#xff0c;刚开始这个接口运行得正常#xff0c;但是上线运行一段时间后接口就出现了#xff0c;如图的栈溢出错误。可以看出确实是堆栈溢出了#xff0c;解决栈溢出目前只有两种方式#xff1a;
第一种调大栈的大小…问题截图 由于作者使用递归统计信息刚开始这个接口运行得正常但是上线运行一段时间后接口就出现了如图的栈溢出错误。可以看出确实是堆栈溢出了解决栈溢出目前只有两种方式
第一种调大栈的大小
-Xss 来配置栈的大小。 目前作者没有选择个方式。
第二种通过读代码减少递归层数
public SetString getTableParents(SetString targetIds,SetString parentsSet){ListLineageTableDO tableDOList tableRelationMapper.selectList(new LambdaQueryWrapperLineageTableDO().in(LineageTableDO::getTargetId,targetIds));if (ObjectUtils.isNotEmpty(tableDOList)){SetString newTargetIds new HashSet();//将父系id查出来tableDOList.stream().forEach(s-newTargetIds.add(s.getSourceId()));parentsSet.addAll(newTargetIds);//再作为字进行二次查询getTableParents(newTargetIds,parentsSet);}return parentsSet;}
作者通过日志和阅读代码逻辑发现每次newTargetIds 基本都是重复的导致递归次数指数增长于是修改成如下代码
public SetString getTableParents(SetString targetIds,SetString parentsSet){//System.out.println(targetIds Size targetIds.size() , pSet parentsSet.size());ListLineageTableDO tableDOList tableRelationMapper.selectList(new LambdaQueryWrapperLineageTableDO().in(LineageTableDO::getTargetId,targetIds));if (ObjectUtils.isNotEmpty(tableDOList)){//System.out.println(childTable size tableDOList.size());SetString newTargetIds new HashSet();//将父系id查出来tableDOList.stream().forEach(s-newTargetIds.add(s.getSourceId()));SetString tmpSets new HashSet();if (CollectionUtils.isNotEmpty(newTargetIds)) {newTargetIds.forEach(s - {if (!parentsSet.contains(s)) {tmpSets.add(s);}});}if (CollectionUtils.isNotEmpty(tmpSets)) {parentsSet.addAll(tmpSets);//再作为字进行二次查询getTableParents(newTargetIds,parentsSet);}}return parentsSet;}最后成功解决