golang mysql: packets.go:37: read tcp 170.1.120.100:49798->192.1.0.121:3306: i/o timeout
看到无效连接,首先想到的是mysql服务端关闭,但是go db连接池中客户端为关闭导致的异常。我们可以看到,package中的日志是errLog.Print(err)打印的。最近使用gorm v1.22.5 报错invalid connection。我们业务中拿到的日志是第39行返回的 ErrInvalidConn 无效连接。并且在38行代码中,dbConn先进行了关闭,所以连接池中的连接是正常的
最近使用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先进行了关闭,所以连接池中的连接是正常的。
只是这里把超时异常转成无效连接异常不是很理解为什么这样做,有懂的朋友们可以多多指教,感谢。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)