2017-06-15 4 views
0

私はWindows上の例の下で実行した場合、私はすぐに(私が64Kに設定されている)TCP接続の制限をヒットし、エラーが発生します: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()'で 'defer db.Close()'を実行し、プログラムが停止したときにのみ実行されるためです。 – RickyA

+0

@RickyA:そうじゃない?プログラムの終わりにdb接続を閉じます。どこにdbへの接続を閉じますか? –

+0

それを閉じることは大丈夫ですが、私はちょうどそれがなぜ閉ざされるのかについてあなたの質問に答えていました。私はそのパッケージに慣れていないので、各呼び出しの後に接続を閉じたい、または内部的に接続プールを維持することが望ましいかもしれません。それはドキュメントにあるはずです。 – RickyA

答えて

1

は@Glavićで私のコメントの議論からの回答を起草。

TIME_WAITステータスと接続を制御しておくために、とSetMaxIdleConnsの設定を使用します。必要に応じてSetConnMaxLifetimeも使用しますが、一般的には必要ありません。

関連する問題