代码: time.Sleep(1*time.Minute) i ,_:=dao.Where("id =?", id).Where("pay_status",0).Count() 报错信息: [mysql] 2019/10/15 15:11:56 packets.go:36: read tcp 192.168.0.212:55385->47.94.18.204:3306: wsarecv: An existing connection was forcibly closed by the remote host. 2019-10-15 15:11:56.732 [ERRO] SELECT COUNT(1) FROM orders WHERE (id =?) AND (pay_status=?), [244 0], 2019-10-15 15:11:56.598, 2019-10-15 15:11:56.731, 133 ms, Error: invalid connection Backtrace:
Q
[gogf/gf]延迟1分钟之后再进行sql操作不行。
3
A
回答
9
@qinglong001 很抱歉,我没有复现你所说的问题,我测试了1分钟又1分钟,但是依旧无法复现,以下是我使用的测试代码:
package main
import (
"github.com/gogf/gf/frame/g"
"time"
)
func test1() {
db := g.DB()
db.SetDebug(true)
time.Sleep(1 * time.Minute)
r, e := db.Table("test").Where("id", 10000).Count()
if e != nil {
panic(e)
}
g.Dump(r)
}
func test2() {
db := g.DB()
db.SetDebug(true)
dao := db.Table("test").Safe()
time.Sleep(1 * time.Minute)
r, e := dao.Where("id", 10000).Count()
if e != nil {
panic(e)
}
g.Dump(r)
}
func main() {
test1()
test2()
}
以下为IDE运行输出结果:
6
@qinglong001 我怀疑你这个问题是因为MySQL
服务端的wait_timeout
系统参数比较短造成连接被服务端断掉了,而gdb
的连接池默认情况下MaxConnLifetime
为0,表示不过期,你可以将该参数设置小一点试试,例如10
秒。设置方式参考:https://goframe.org/database/gdb/config
8
3
3
8
我的设置没问题。你上面的示例是在一个go文件。我的是在两个go文件
1
@qinglong001 问题无法复现,请更新到最新版本再试试,如果问题依旧请重新打开该issue
。
1
见这里 https://github.com/grafana/grafana/issues/17777 https://github.com/golang/go/issues/32530 估计是golang的bug,服务端关闭链接,go的mysql连接池里有未清理的过期连接
0
@qinglong001 @busyfree 看起来似乎是一个BUG。