Mysql: 複数の同時ゴルーチンを使用している場合、「dial tcp 127.0.0.1:3306:connect:cannotassignedaddress」を取得しました

作成日 2019年01月17日  ·  3コメント  ·  ソース: go-sql-driver/mysql

問題の説明

複数の同時ゴルーチンを使用しているときに、しばらくすると「dial tcp 127.0.0.1:3306:connect:cannotassignedaddress」が表示されました。

  • 8つの同時ゴルーチンを使用する場合=>すべてがOKです
  • より多くのgoroutines =>を約15秒後に使用すると、すべての要求がerr = "dial tcp 127.0.0.1:3306:connect:cannotassignedaddress"で失敗します。 最初の失敗の前に、約35,000の要求が正常に実行されました。

SQLドライバーが新しい接続を確立するための新しいポートを取得できないように見えますが、そうであれば、プールからの既存の接続を再利用しない理由がわかりませんか?

エラーが発生したとき、次のDBStatがあります。
(sql.DBStats){
MaxOpenConnections:(int)0、
OpenConnections:(int)64、
使用中:(int)64、
アイドル:(int)0、
WaitCount:(int64)0、
WaitDuration:(time.Duration)0s、
MaxIdleClosed:(int64)28252、
MaxLifetimeClosed:(int64)0
}

私はgo-sql-driverV1.4.1とgo1.11.2を使用して、Dockerコンテナーとしてローカルで実行されているmariaDBにアクセスします。
以下の例では、同様のエラーが大量に発生しないように「パニック」を追加しました。

サンプルコード

// the below code is called repetitly from a configurable number of worker fed using channels (fan-out)
// Mark visa_card entry as migrated
        query := fmt.Sprintf(UPDATE visa_card SET migrated=TRUE WHERE id_card=%s, this.idCard)
        _, err = conf.MySql.ExecContext(ctx, query)
        if err != nil {
            log.Error(ctx, log.EventTypeBusiness, "", err)
            spew.Dump(conf.MySql.Stats())
            panic("the END")
        }
        return err

エラーログ

{"level":"info","dateTime":"2019-01-17T14:58:04.095+0100","msg":"","appVersion":"0.0.0","component":"VISA-MIGRATOR","country":"bw","eventType":"incoming request","requestId":"d25e58f8-8228-4a7f-9cc4-1fd9ea2230b4","useCase":"","parameters":{"request_headers":{},"request_http_method":"POST","request_uri":"/startImportActiveCards"},"caller":"common/utils/log/ginLog.go:70"}
{"level":"error","dateTime":"2019-01-17T14:58:20.562+0100","msg":"","appVersion":"0.0.0","component":"VISA-MIGRATOR","country":"bw","eventType":"internal","requestId":"d25e58f8-8228-4a7f-9cc4-1fd9ea2230b4","useCase":"startMigration","peer":"internal","caller":"migrator/migrate/migrateActiveCards.go:211","errorDetails":"dial tcp 127.0.0.1:3306: connect: cannot assign requested address"}
(sql.DBStats) {
 MaxOpenConnections: (int) 0,
 OpenConnections: (int) 50,
 InUse: (int) 50,
 Idle: (int) 0,
 WaitCount: (int64) 0,
 WaitDuration: (time.Duration) 0s,
 MaxIdleClosed: (int64) 28258,
 MaxLifetimeClosed: (int64) 0
}
panic: the END

構成

* go-sql-driver V1.4.1

* Goバージョン:Goバージョンgo1.11.2 linux / amd64

* Dockerコンテナ内のMariaDB10.4.1

サーバーOS:例:Debian 8.1(Jessie)、Windows 10

最も参考になるコメント

これを試して。

db.SetMaxIdleConns(64)
db.SetMaxOpenConns(64)
db.SetConnMaxLifetime(time.Minure)

全てのコメント3件

これを試して。

db.SetMaxIdleConns(64)
db.SetMaxOpenConns(64)
db.SetConnMaxLifetime(time.Minure)

あなたは非常に迅速な対応のためにたくさんの@methaneおかげで、試験は成功です!
デフォルト値が正しく機能しないことに少し驚いています。理由はわかりませんが、実際に問題は解決しました。

この記事を参照してください。
http://techblog.en.klab-blogs.com/archives/31093990.html

記事内のすべての画像が消えます。 彼らは日本語版の記事で生きています。

http://dsas.blog.klab.org/archives/2018-02/configure-sql-db.html

このページは役に立ちましたか?
0 / 5 - 0 評価