这是遇到的第三次升级MySQL8 Java驱动的“坑”之三。分享一些经历,希望可以帮你少掉进坑里。
之三如下:
①最近有伙伴悄悄升级了Java MySQL8驱动,上线之后业务报障:说某某功能怎么提交不了,而且还提示报错。接到消息,立马查看。排查是某个查询接口报错,于是进一步排查,发现这生产日志打印如下:
可以从上面的异常日志发现,应该是某个字段类型不匹配造成的告警?到底是哪块功能?好像都没人有变更代码。
②跟着异常信息,显然是String和Integer类型转换的问题。我们打开业务代码,发现数据表对应的实体字段类型不一致,以为是最近有人改过数据表字段类型,但是经过了解这表的字段一直是这样,从来没有改过。那么修复它的方法就是:修改类型与表字段类型一致即可,立马修复发布测试环境验证,通过之后立马发布生产,避免影响业务使用。
③接下来查看接口代码,一看这代码都是2020年的,之后基本没人改过代码了。而且业务反馈之前都用的好好的,为什么现在不行了,是不是改了什么东西??所以就很疑惑。于是发现最近是有版本发布,但是应该跟这块无关。因为代码确实没有改过呀!
但是!但是!一看提交记录才发现有人升级了MySQL8驱动。那么应该就是它引起的吧?
④于是剖开源码一探究竟,MySQL5驱动的源码处理是这样的:
而MySQL8驱动源码是这样的:
最终,从MySQL驱动源码知道。在MySQL5之前,字段数据处理出现类型异常时,异常堆栈就被“吃”了,从而不影响“正常使用”。但是在MySQL8驱动则做了修改,使用了工厂的设计模式进行不同类型的转换,针对这种类型转换异常,则是直接往外抛,进而在本案例中上面的异常情况。
总结:
编码不规范,码农两行泪!
技术债务始终是逃不掉的!
文章评论