Recebi "discar tcp 127.0.0.1:3306: conectar: não é possível atribuir o endereço solicitado" depois de algum tempo, ao usar vários goroutines simultâneos:
Parece que o driver sql não pode obter uma nova porta para estabelecer uma nova conexão, mas se sim, não entendo por que ele não reutiliza uma conexão existente do pool?
Eu tenho os seguintes DBStats quando o erro acontece:
(sql.DBStats) {
MaxOpenConnections: (int) 0,
OpenConnections: (int) 64,
InUse: (int) 64,
Inativo: (int) 0,
WaitCount: (int64) 0,
WaitDuration: (time.Duration) 0s,
MaxIdleClosed: (int64) 28252,
MaxLifetimeClosed: (int64) 0
}
Eu uso go-sql-driver V1.4.1 com go 1.11.2, para alcançar um mariaDB rodando localmente como um contêiner docker.
No exemplo abaixo adicionei o "pânico" apenas para não ser inundado por um monte de erros semelhantes.
// 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
* Versão Go: versão go go1.11.2 linux / amd64
* MariaDB 10.4.1 no contêiner docker
Sistema operacional do servidor: por exemplo, Debian 8.1 (Jessie), Windows 10
Experimente isso.
db.SetMaxIdleConns (64)
db.SetMaxOpenConns (64)
db.SetConnMaxLifetime (time.Minure)
Muito obrigado @methane por sua resposta rápida, o teste foi um sucesso!
Ainda estou um pouco surpreso que os valores padrão não funcionem corretamente e não entendo o porquê, mas de fato você resolveu meu problema.
Veja este artigo.
http://techblog.en.klab-blogs.com/archives/31093990.html
Todas as imagens do artigo desapareceram. Eles estão vivos na versão japonesa do artigo.
http://dsas.blog.klab.org/archives/2018-02/configure-sql-db.html
Comentários muito úteis
Experimente isso.
db.SetMaxIdleConns (64)
db.SetMaxOpenConns (64)
db.SetConnMaxLifetime (time.Minure)