最近使用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先进行了关闭,所以连接池中的连接是正常的。
只是这里把超时异常转成无效连接异常不是很理解为什么这样做,有懂的朋友们可以多多指教,感谢。