您的位置 首页 php

踩坑日记(一):半夜打DBA电话解决数据库连接超时自动回滚问题

点击上方“ IT实战联盟 ”,关注“头条号”

领导要高高在上

平时多听听他人的意见

然后认真记下来到底是谁对你有意见

背景

很少用的一个业务后台管理端需要导入一批数据(200多条),用户在导入的时候没有成功。业务场景比较复杂,需要将每条数据去数据库匹配、关联、分析后再将结果进行更新。大约涉及5张表、3000多万笔数据。

报错日志分析

从报错日志上来看,主要是由于连接时间过长,导致连接失效。那么那失效的连接去请求数据库就会报上图的异常。

排查步骤

第一步:检查数据库连接池设置的超时时间

首先想到的是项目中配置的数据库连接池超时时间设置小了,具体配置如下:

 spring.datasource.max-wait: 120000  

那就“豪放”一点加个 0 ,测试发现依然报错。

第二步:分析报错数据

连接池的超时时间没有问题那就分析一下具体的报错数据,是否由于数据原因导致。修改日志级别(由于该功能一直在正常使用,日志级别是debug),将报错数据进行输出。排除因导入文件格式、内容编码格式等因素。

根据打印的数据拼接SQL到数据库进行执行也是正常的,接着连续重试多次上传功能每次引起报错的数据也不是同一个。

第三步:分析业务SQL

首先反应的是代码块有慢SQL导致连接超时,根据日志报错的代码行将SQL单独执行是毫秒级的,并且只有一个用户操作是单线程,这样也不存在并发现象。

排除慢SQL 问题。

第四步:分析底层报错日志

项目业务和SQL层面排查完毕后,没有定位到问题根本原因,只能继续分析报错日志。

从上图看到和查询结果集的数据类型有关,难道匹配的数据存在null、或者类型有问题?再一次执行了报错数据,认真的检查了一遍数据类型和数据信息都正常,没有特别的地方。

到这里卡壳了……

第五步:求助 MySQl Bug 网站

其实已经定位到是mysql 的问题,但是具体原因和解决方案还没有找到,这里只能到MySQL Bug 官网去碰一碰运气。

找到了和我们一样的问题记录,大致是 mysql 连接池的某个版本的Bug,这里赶紧看一下自己项目中用的是哪个版本:

 compile('mysql:mysql-connector-java:5.1.39')  

虽然从版本来看是比较低,但是找了一圈也没有看到从哪个版本起修复了这个问题,难道要升级到最新的8.x ?

但是项目是比较老的,升级后需要经过完整的回归测试才行,并且短时间内没办法进行全面的测试。

第六步:临时升级 mysql-connector-java

经团队讨论可以进行临时的升级解决用户的问题,然后再降级优化业务逻辑解决问题,甚至后续可以进行重构。

升级为 6.x……

执行……

问题依然存在!!!

第七步:求助 DBA

半夜打 DBA 电话帮忙看一下数据库层面是否可以给一些建议,DBA 查询数据库设置超时时间:

 show global variables like '%timeout%';  

等待时间只有 180 秒,其他数据库的超时时间都是 28800(默认8小时)。

修改数据库超时时间为28800,再次执行成功。

总结

最近数据库做过迁移,DBA 回复这个超时时间应该都是统一默认的,不知道在什么时候被修改了。

虽然通过修改数据库设置的方式解决了问题,但是在业务设计层面也存在问题。整个上传服务前同事用的是一个大事务,要么全部成功,要么全部失败。在业务量小的时候是不会遇到这个问题的,但是随着需求的不断迭代,系统的复杂度越来越高就暴露出来了。

无意中发现了 mysql 连接的一个bug,虽然比较老但是也有收获。

欢迎大家关注“IT实战联盟”头条号,后续有更多的踩坑问题分享给大家……

文章来源:智云一二三科技

文章标题:踩坑日记(一):半夜打DBA电话解决数据库连接超时自动回滚问题

文章地址:https://www.zhihuclub.com/152211.shtml

关于作者: 智云科技

热门文章

网站地图