背景

线上一个定时任务,使用gorm框架,读写阿里云RDS,在创建连接和udpate操作中时不时出现这个错误

[mysql] 2021/08/01 18:30:31 packets.go:37: read tcp 172.17.0.3:48356->172.16.0.25:3306: i/o timeout
panic: 定时改价任务报警: invalid connection; invalid connection,update price,pid:6809290

从附录1可以学到

1.基准测试验证不同配置对性能的影响

2.MaxIdleConns应该始终小于或等于MaxOpenConns.

Q:空闲连接是否可以设置得很大 TODO

A:

  • 空闲连接多的好处 理论上因为空闲连接节省了新新连接的时间,有利于提高性能,从这个角度看,空闲连接越多越好。
  • 空闲连接过多的坏处 1.空闲连接占用内存 2.如果一个连接空闲太久,那么它也可能会变得不可用。 因此,将MaxIdleConns设置得太高实际上可能会导致连接变得不可用,并且使用的资源比使用较小的空闲连接池(使用的连接更少,使用频率更高)的情况下要多。 所以只有你很可能马上再次使用这些连接,你才会保持这些连接空闲。

  • 空闲连接设置的准则 配置合适的连接数,使得这些连接可以频繁的被用到.

golang-mysql超时设置

// 附录2

var DefaultConfig = map[string]string{
	"charset":      "utf8",
	"parsetime":    "True",
	"loc":          "Local",
	"timeout":      "15s",
	"readTimeout":  "2s",
	"writeTimeout": "5s",
	"maxIdle":      "10",
	"maxOpenConn":  "100",
	"maxLifetime":  "1",
}

附录

1.[译]配置 sql.DB 获得更好的性能 2.golang中mysql建立连接超时时间timeout 测试

原创文章转载请注明出处: mysql-sql.DB-SetMaxOpenConns和SetMaxIdleConns,SetConnMaxLifetime