J'ai obtenu « dial tcp 127.0.0.1:3306 : connect : impossible d'attribuer l'adresse demandée » après un certain temps, lors de l'utilisation de plusieurs goroutines simultanées :
On dirait que le pilote sql ne peut pas obtenir un nouveau port pour établir une nouvelle connexion, mais si c'est le cas, je ne comprends pas pourquoi il ne réutilise pas une connexion existante du pool ?
J'ai les DBStats suivants lorsque l'erreur se produit :
(sql.DBStats) {
MaxOpenConnections : (int) 0,
Connexions ouvertes : (int) 64,
En cours d'utilisation : (int) 64,
Inactif : (int) 0,
WaitCount : (int64) 0,
WaitDuration : (time.Duration) 0s,
MaxIdleClosed : (int64) 28252,
MaxLifetimeClosed : (int64) 0
}
J'utilise go-sql-driver V1.4.1 avec go 1.11.2, pour atteindre une mariaDB s'exécutant localement en tant que conteneur docker.
Dans l'exemple ci-dessous, j'ai ajouté la "panique" uniquement pour ne pas être inondé par un tas d'erreurs similaires.
// 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
*Version go : go version go1.11.2 linux/amd64
*MariaDB 10.4.1 dans un conteneur Docker
Système d'exploitation du serveur : par exemple Debian 8.1 (Jessie), Windows 10
Essaye ça.
db.SetMaxIdleConns(64)
db.SetMaxOpenConns(64)
db.SetConnMaxLifetime(time.Minure)
Merci beaucoup @methane pour votre réponse très rapide, l'essai est réussi !
Je suis quand même un peu surpris que les valeurs par défaut ne fonctionnent pas correctement et je ne comprends pas pourquoi mais effectivement vous avez résolu mon problème.
Voir cet article.
http://techblog.en.klab-blogs.com/archives/31093990.html
Toutes les images de l'article ont disparu. Ils sont vivants dans la version japonaise de l'article.
http://dsas.blog.klab.org/archives/2018-02/configure-sql-db.html
Commentaire le plus utile
Essaye ça.
db.SetMaxIdleConns(64)
db.SetMaxOpenConns(64)
db.SetConnMaxLifetime(time.Minure)