如何在多个并发时解决TIME_WAIT状态问题?

时间:2017-06-15 06:41:39

标签: database go

如果我在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)
}

1 个答案:

答案 0 :(得分:1)

从我与@Glavić的评论讨论中起草答案。

利用SetMaxOpenConnsSetMaxIdleConns设置来控制TIME_WAIT状态和连接。如果需要,也可以使用SetConnMaxLifetime,通常不需要。