从“gorm建立mysql数据库连接,偶现tcp: i/o timeout问题”简单看gorm.DB源码

文章探讨了在go服务中使用gorm连接mysql时遇到的偶发tcp i/o timeout问题,分析了可能的原因。问题源于每次请求时都会创建新的gorm.DB实例,导致连接池内的连接无法及时释放,当并发量增大时耗尽mysql连接数,从而引发timeout。解决方案是合理管理数据库连接,避免频繁创建新的连接实例。
摘要由CSDN通过智能技术生成

昨天被同事问到一个问题:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值