一、使用beego的http library 需要注意,默认情况下maxconnectionsperhost参数为-1,即默认不使用连接池。
问题: 大量并发情况下,http底层的tcp连接得不到重复利用,造成大量的tcp短连接。虽然连接使用之后就会被释放,但是tcp完全释放需要一定时间(主要是最后一阶段客户端的time_wait,这个是tcp协议的特性
决定的)导致短时间内客户端机器积累大量tcp连接,最终“爆仓”出现问题。
解决办法:设置http使用tcp连接池,golang里面是自定义一个transport。主要参数如下:
http.Transport{
...
MaxIdleConns
IdleConnTimeout
MaxIdleConnsPerHost
...
}
二、使用beego的orm或者golang-mysql驱动(beego orm实际上就是使用golang-mysql的驱动)需要注意,默认情况下maxidleconns和maxopenconns参数为0,即默认不使用连接池,也不限制连接数。
问题: 1.大量并发情况下,进程与数据库的tcp连接得不到重复利用,造成大量的tcp连接,超过数据库支持的最大连接数后报错 too many connections
2.程序在重复使用数据库tcp连接池中的某个连接时,该命中连接可能已被服务器过期丢弃,而客户端这边认为该连接为过期,还有效。此时会报错 invalid connection 。随后将该连接重连接池中丢弃
解决办法:1.设置数据库连接池,以下是beego orm下设置参考:
orm.SetMaxIdleConns("dbname", number)
orm.SetMaxOpenConns("dbname", number)
2.设置单个数据库连接最大生命周期。值得注意的是,beego orm不提供接口直接的设置,需要获取到orm底层使用的db连接池对象进行参数设置。如下:
db,_ := orm.GetDB("dbname")
db.SetConnMaxLifetime(time duration)
注意,以上参数均为数据库连接客户端参数设置,每个参数都不能超过数据库服务器与之相对应的参数值。