
MyBatis版本升级引发的线上告警回顾及原理分析
https://mp.weixin.qq.com/s/sk0Kou9V727tRe5wddmDig
因为报 警这一块代码,属 于历史功能,如果失败并不会影响主 流程。但在定位期 间,如果频繁报
警的话,就会造成一定的干扰。因此,我们马上 采取了回滚操作,将inf-bom的版本回滚至历史版
本,直 至报警消失,然后 再进行问题的定位和分析。以下章节 就是我们对报警原 因的定位及原因
详细分析的介绍,希望这些思路能够对大家有所启发和帮助。
报警原因定位
在回滚完毕后,我们开始具体分析报警产生的主要原因,于是进行了以下几步的排查。
第一步,查看了报警的Mapper方法,如下代码段所示。 这个是接收返回参数,根据主键id,更新
具体响应内容和时间的代码,入参有3个,类型分别为long、String和LocalDateTime。
int updateResponse(@Param("id")long id, @Param("response")String response, @Param(
第二步,我们查看了 Mapper方法对应的XML文件,如下代码段所示,对应的parameterType类型
是String,而实际参数的类型包括long、String以及LocalDateTime。
<update id="updateResponse" parameterType="java.lang.String">
UPDATE invoice_log
SET response = #{response}, update_time = #{updateTime}
WHERE id = #{id}
</update>
第三步,我们 查看了MyBatis上线前后的版本,报警 的内容是:MyBatis在处理SQL语句时,发现
不能将LocalDateTime转型为String,这一段逻辑在上线前是可以正常运行的,并且上线的业 务逻
辑对这段历史代码无改动。因此,我们猜测是因为inf-bom的升级,从 而 导 致MyBatis的版本发生了
变化,对某些历史功能不再支持了。MyBatis版本上线前后的变化如下表所示:
表1 MyBatis版本升级前后对比
第四步,我们通过第三步可以得到,在这次inf-bom的版本升级中,MyBatis的版本直接升了两个大
版本,因此我们可以基本将原因猜测为MyBatis升级跨度较大,导致部分历史功能没有兼容支持,
评论