大家好,我是90后程序员奶爸!在尝试求变的路上,迈出第一步!
昨天晚上,我被临时告知,某地项目更新新版本后,出现了功能问题。需要我临时排查一下,想来想去,还是把排查的结果记录一下。
问题描述
原本功能:页面会展示 评价结果的分布记录,如 A 20% B 20% C 60%
更新版本后:历史记录不影响,但新结果的分布记录变成 A NaN% B NaN% C NaN%
排查过程
想着版本都测试过,代码逻辑应该没问题。但为了以防万一,还是去看了下日志。结果发现是汇总结果的时候没有获取到所有的评价结果。
看了下代码逻辑,原本以为是
public List<Map<String, Object>> getRanksByCalBatch(String calBatch) { try { String sql = "SELECT rank ,COUNT(*) count FROM report_evaluation_result_record_list WHERE cal_batch_no = '" + calBatch + "' GROUP BY rank "; List<Map<String, Object>> ranks = jdbcTemplateOne.queryForList(sql); if (CollectionUtils.isEmpty(ranks)) { return new LinkedList<>(); } return ranks; } catch (Exception e) { return new LinkedList<>(); } }
参数不对,或者传值有问题。但是这里没有日志,也不好确定。只好增加下日志,看下情况。
发现日志打印的参数,是正确的。只是数据库查询没有返回结果。
尝试把sql放到测试数据库中执行,发现没有问题。一开始怎么也想不明白,就准备去线上库看下,结果一执行就报错。
发现是
1、“rank”字段在mysql8中是一个新功能(关键字),所以不可以将其当作字段名;
2、如果是mysql5.7版本的话,rank作为字段是没有问题的(版本的问题),如果本地mysql是5版本不会报错,线上是mysql8就会报错。
解决方案
调整了下代码
@Override public List<Map<String, Object>> getRanksByCalBatch(String calBatch) { try { String sql = "SELECT `rank` ,COUNT(*) count FROM report_evaluation_result_record_list WHERE cal_batch_no = '" + calBatch + "' GROUP BY `rank` "; List<Map<String, Object>> ranks = jdbcTemplateOne.queryForList(sql); if (CollectionUtils.isEmpty(ranks)) { return new LinkedList<>(); } return ranks; } catch (Exception e) { return new LinkedList<>(); } }
总算解决了~记录一次排错过程
搞不定这个代码块~总是折叠,想看的可以去 codecopy.cn/post/8dgj3v 代码小抄里面看