![](/img/trans.png)
[英].NET Web Service leaving many MySQL connections open with TIME_WAIT
[英]How to solve TIME_WAIT state issue when in multiple concurrency?
如果我在Windows上運行以下示例,我將很快達到TCP連接限制(我將其設置為64k)並得到錯誤: dial tcp 127.0.0.1:3306: connectex: Only one usage of each socket address (protocol/network address/port) is normally permitted.
我看到所有這些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
,通常是不需要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.