2017-06-15 40 views
0

如果我在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狀態問題?

我看到這一切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:[email protected]/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

,因爲你在'main()'中做了'推遲db.Close()',並且只在程序停止時執行。 – RickyA

+0

@RickyA:不好嗎?在程序結束時關閉數據庫連接...你將關閉與數據庫的連接? –

+0

關閉它是好的,但我只是回答你爲什麼它不關閉的問題。我對這個軟件包並不熟悉,所以也許它希望在每次調用之後關閉連接,或者在內部保持一個連接池。這應該在文檔中。 – RickyA

回答

1

起草從我的意見的討論答案與@Glavić。

利用SetMaxOpenConnsSetMaxIdleConns設置來保持TIME_WAIT的狀態和連接在控制之下。如果需要也使用SetConnMaxLifetime,通常不需要。

相關問題