Mysql: Получил «dial tcp 127.0.0.1:3306: connect: невозможно назначить запрошенный адрес» при использовании нескольких одновременных горутин.

Созданный на 17 янв. 2019  ·  3Комментарии  ·  Источник: go-sql-driver/mysql

Описание проблемы

Я получил "набрать tcp 127.0.0.1:3306: подключиться: невозможно назначить запрошенный адрес" через некоторое время при использовании нескольких параллельных горутин:

  • При одновременном использовании 8 горутин => все в порядке
  • При использовании большего количества горутин => примерно через 15 секунд каждый запрос завершается ошибкой с ошибкой err = "dial tcp 127.0.0.1:3306: connect: невозможно назначить запрошенный адрес". До первого сбоя было успешно выполнено около 35 000 запросов.

Похоже, драйвер sql не может получить новый порт для установления нового соединения, но если да, то я не понимаю, почему он не использует повторно существующее соединение из пула?

Когда возникает ошибка, у меня появляется следующая DBStats:
(sql.DBStats) {
MaxOpenConnections: (целое) 0,
OpenConnections: (int) 64,
InUse: (int) 64,
В режиме ожидания: (int) 0,
WaitCount: (int64) 0,
WaitDuration: (time.Duration) 0 с,
MaxIdleClosed: (int64) 28252,
MaxLifetimeClosed: (int64) 0
}

Я использую go-sql-driver V1.4.1 с go 1.11.2, чтобы получить доступ к 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-драйвер V1.4.1

* Версия Go: версия go1.11.2 linux / amd64

* MariaDB 10.4.1 в докер-контейнере

Серверная ОС: например, Debian 8.1 (Jessie), Windows 10

Самый полезный комментарий

Попробуй это.

db.SetMaxIdleConns (64)
db.SetMaxOpenConns (64)
db.SetConnMaxLifetime (время.Minure)

Все 3 Комментарий

Попробуй это.

db.SetMaxIdleConns (64)
db.SetMaxOpenConns (64)
db.SetConnMaxLifetime (время.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 рейтинги