douliexu5623 2017-06-15 06:41
浏览 94
已采纳

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

If I run below example on Windows I will quickly hit TCP connection limit (which I set to 64k) and get error: dial tcp 127.0.0.1:3306: connectex: Only one usage of each socket address (protocol/network address/port) is normally permitted.

I see all this TIME_WAIT states waiting for there lifetime to end with: netstat -ano|findstr 3306

Why aren't connections closed immediately?

The code:

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条回答 默认 最新

  • duanlvxi8652 2017-06-15 08:52
    关注

    Drafting answer from my comments discussion with @Glavić.

    Utilize the SetMaxOpenConns and SetMaxIdleConns settings to keep TIME_WAIT status and connections under control. If needed use SetConnMaxLifetime too, generally it's not needed.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样