如果我在 Windows 上运行下面的示例,我将很快达到 TCP 连接限制(我设置为 64k)并得到错误:dial tcp 127.0.0.1:3306: connectex: 每个套接字地址只有一个用法(协议(protocol)/网络地址/端口)通常是允许的。
我看到所有这些 TIME_WAIT
状态都在等待生命周期结束:netstat -ano|findstr 3306
为什么不立即关闭连接?
代码:
package main
import (
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
"log"
"sync"
)
var (
db_instance *sqlx.DB
wg sync.WaitGroup
)
func main() {
db, err := sqlx.Connect("mysql", "user:pass@/table")
if err != nil {
log.Fatalln(err)
}
defer db.Close()
db_instance = db
for {
for l := 0; l < 50; l++ {
wg.Add(1)
go DB_TEST()
}
wg.Wait()
}
}
func DB_TEST() {
defer wg.Done()
var s string
err := db_instance.QueryRow("SELECT NOW()").Scan(&s)
if err != nil {
log.Println(err)
return
}
log.Println(s)
}
最佳答案
根据我与@Glavić 的评论讨论起草答案。
利用 SetMaxOpenConns
和 SetMaxIdleConns
设置来控制 TIME_WAIT
状态和连接。如果需要,也可以使用 SetConnMaxLifetime
,通常不需要。
关于database - 如何解决多并发时的TIME_WAIT状态问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44560390/