Obtuve "dial tcp 127.0.0.1:3306: connect: can't assign request address" después de algún tiempo, al usar múltiples goroutines concurrentes:
Parece que el controlador sql no puede obtener un nuevo puerto para establecer una nueva conexión, pero si es así, no entiendo por qué no reutiliza una conexión existente del grupo.
Tengo los siguientes DBStats cuando ocurre el error:
(sql.DBStats) {
MaxOpenConnections: (int) 0,
Conexiones abiertas: (int) 64,
En uso: (int) 64,
Inactivo: (int) 0,
WaitCount: (int64) 0,
WaitDuration: (time.Duration) 0s,
MaxIdleClosed: (int64) 28252,
MaxLifetimeClosed: (int64) 0
}
Utilizo go-sql-driver V1.4.1 con go 1.11.2, para llegar a un mariaDB que se ejecuta localmente como un contenedor acoplable.
En el siguiente ejemplo, agregué el "pánico" solo para no ser inundado por un montón de errores similares.
// 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 versión: Go versión go1.11.2 linux / amd64
* MariaDB 10.4.1 en el contenedor de la ventana acoplable
SO del servidor: por ejemplo, Debian 8.1 (Jessie), Windows 10
Prueba esto.
db.SetMaxIdleConns (64)
db.SetMaxOpenConns (64)
db.SetConnMaxLifetime (tiempo.Minuro)
Muchas gracias @methane por su respuesta tan rápida, ¡la prueba fue exitosa!
Todavía estoy un poco sorprendido de que los valores predeterminados no funcionen correctamente y no entiendo por qué, pero de hecho resolvió mi problema.
Vea este artículo.
http://techblog.en.klab-blogs.com/archives/31093990.html
Todas las imágenes del artículo desaparecen. Están vivos en la versión japonesa del artículo.
http://dsas.blog.klab.org/archives/2018-02/configure-sql-db.html
Comentario más útil
Prueba esto.
db.SetMaxIdleConns (64)
db.SetMaxOpenConns (64)
db.SetConnMaxLifetime (tiempo.Minuro)