返回信息流主要代码如下:
import (
"database/sql"
"time"
_ "github.com/go-sql-driver/mysql"
)
var db_client *sql.DB
func init() {
db, err := sql.Open("mysql", beego.AppConfig.String("db_username")+":"+beego.AppConfig.String("db_password")+"@tcp("+beego.AppConfig.String("db_host")+":"+beego.AppConfig.String("db_port")+")/?charset=utf8")
db_client = db
db_client.SetMaxOpenConns(500)
db_client.SetMaxIdleConns(250)
db_client.SetConnMaxLifetime(24 * 3600 * time.Second)
checkErr(err)
}
小站流量小 空闲时间长 长时间不用的页面刷新后就会报错 多次刷新后正常
日志里的报错如下:
[mysql] 2017/10/28 18:04:15 packets.go:36: read tcp 172.31.54.26:44132->221.229.204.142:3306: read: connection reset by peer
应该是长时间空闲 被服务端断开连接了
各位大神有没有好的mysql链接实现方案
这是一条镜像帖。来源:北邮人论坛 / golang / #888同步于 2017/10/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Golang机器人发帖
mysql连接池 长时间空闲 会死掉 怎么搞
lzc123ok
2017/10/28镜像同步15 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
我能想到最蠢最蠢的方法是后端启动时起一个goroutine 每隔一段时间执行一个简单的sql语句 比如新建一个永远不用的空表tableA 然后select * from tableA
这个设置显然没起作用 不知道的是不是有最大值限制
【 在 kulayami 的大作中提到: 】
: 而且楼主说的长时间不用是指多长 你代码里setconnmaxlifetime只有24小时是不是短了?
还有看报错是tcp的报错 对于tcp长连接 如果双方长时间不通信 服务端的服务器会发探测报文 假如探测不到就断开 隔多久发、发几次这些都是linux的设置 假如这个没设置好其实和mysql就没关系了 是底层tcp长连接的问题
客户端一直保持心跳 这种方法总感觉 不是最好的解决方案吧
【 在 kulayami 的大作中提到: 】
: 我能想到最蠢最蠢的方法是后端启动时起一个goroutine 每隔一段时间执行一个简单的sql语句 比如新建一个永远不用的空表tableA 然后select * from tableA
好的 我试着从这方面看看
【 在 kulayami 的大作中提到: 】
: 还有看报错是tcp的报错 对于tcp长连接 如果双方长时间不通信 服务端的服务器会发探测报文 假如探测不到就断开 隔多久发、发几次这些都是linux的设置 假如这个没设置好其实和mysql就没关系了 是底层tcp长连接的问题
当然不是 先绕过问题嘛 能绕过问题绝对不解决问题23333
【 在 lzc123ok (奔跑的老头) 的大作中提到: 】
: 客户端一直保持心跳 这种方法总感觉 不是最好的解决方案吧
我觉得是设置长了, 先看下这个参数的定义:
SetConnMaxLifetime sets the maximum amount of time a connection may be reused.
Expired connections may be closed lazily before reuse
mysql的sever有个配置, 连接空间时间过长,会主动断开连接. 所以你这个时间要设置的比mysql server的那个时间短才行, 要不然mysql server断开了, golang 的连接池还认为这个连接可用, 就出错了
【 在 kulayami 的大作中提到: 】
: 而且楼主说的长时间不用是指多长 你代码里setconnmaxlifetime只有24小时是不是短了?