昨天被同事问到一个问题:
go服务,gorm建立mysql数据库连接,偶现tcp: i/o timeout问题是怎么回事?
说实话,我平时没怎么用过gorm,也只是简单了解它的用法。
考虑到问题是连接mysql偶现tcp: i/o timeout, 第一反应是怀疑mysql的负载太高,比如连接数太高导致排队。
于是看了下代码对gorm的调用代码:
使用gorm建立连接的场景
这里看起来没什么问题,连接池的参数也都有配上。
// NewDB 连接db
func NewDB(dbKey string) (*gorm.DB, error) {
db, err := gorm.Open("mysql", buildDsn(c, dbKey))
if err != nil {
log.Errorf("Err_Open_Db: dbKey= %s , err= %s", dbKey, err.Error())
return nil, err
}
// 设置一些连接池参数
db.DB().SetConnMaxLifetime(time.Duration(c.GetInt("connMaxLifetime", 600)) * time.Second)
db.DB().SetMaxIdleConns(c.GetInt("maxIdleConns", 10))
db.DB().SetMaxOpenConns(c.GetInt("maxOpenConns", 200))
return db, nil
}
再上层调用NewDB方法的场景:
这里貌似是有问题的,grp