最近使用gorm v1.22.5 报错  invalid connection

packets.go:37: read tcp 170.1.120.100:49798->192.1.0.121:3306: i/o timeout

发生场景:设置 db readTimeout、writeTimeout 为30s,SetConnMaxLifetime 为10s

由于数据库过大,字段没有索引导致查询超时。

业务日志看到的日志是:

packets.go:37: read tcp 170.1.120.100:49798->192.1.0.121:3306: i/o timeout

invalid connection

看到无效连接,首先想到的是mysql服务端关闭,但是go db连接池中客户端为关闭导致的异常。

但是设置的ConnMaxLifetime比较短,所以排除。

排查 github.com/go-sql-driver/mysql/packets.go 1.6.0 第37行

 我们可以看到,package中的日志是errLog.Print(err)打印的

我们业务中拿到的日志是第39行返回的 ErrInvalidConn 无效连接。

并且在38行代码中,dbConn先进行了关闭,所以连接池中的连接是正常的。

只是这里把超时异常转成无效连接异常不是很理解为什么这样做,有懂的朋友们可以多多指教,感谢。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐