簡體   English   中英

多重並發時如何解決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ć的評論討論的起草答案。

利用SetMaxOpenConnsSetMaxIdleConns設置來控制TIME_WAIT狀態和連接。 如果需要,也可以使用SetConnMaxLifetime ,通常是不需要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM