Ich habe nach einiger Zeit "dial tcp 127.0.0.1: 3306: connect: Kann angeforderte Adresse nicht zuweisen" erhalten, wenn ich mehrere gleichzeitige Goroutinen verwende:
Sieht so aus, als ob der SQL-Treiber keinen neuen Port abrufen kann, um eine neue Verbindung herzustellen, aber wenn ja, verstehe ich nicht, warum er keine vorhandene Verbindung aus dem Pool wiederverwendet?
Ich habe die folgenden DBStats, wenn der Fehler auftritt:
(sql.DBStats) {
MaxOpenConnections: (int) 0,
OpenConnections: (int) 64,
InUse: (int) 64,
Leerlauf: (int) 0,
WaitCount: (int64) 0,
WaitDuration: (time.Duration) 0s,
MaxIdleClosed: (int64) 28252,
MaxLifetimeClosed: (int64) 0
}
Ich verwende go-sql-driver V1.4.1 mit go 1.11.2, um eine lokal als Docker-Container laufende mariaDB zu erreichen.
Im folgenden Beispiel habe ich die "Panik" hinzugefügt, nur um nicht von einer Reihe ähnlicher Fehler überflutet zu werden.
// 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-Treiber V1.4.1
*Go-Version: Go-Version go1.11.2 linux/amd64
*MariaDB 10.4.1 im Docker-Container
Server-Betriebssystem: zB Debian 8.1 (Jessie), Windows 10
Versuche dies.
db.SetMaxIdleConns(64)
db.SetMaxOpenConns(64)
db.SetConnMaxLifetime(time.Minure)
Vielen Dank @methan für deine sehr schnelle Antwort, Versuch ist erfolgreich!
Ich bin immer noch ein bisschen überrascht, dass die Standardwerte nicht richtig funktionieren und ich verstehe nicht warum, aber Sie haben mein Problem tatsächlich gelöst.
Siehe diesen Artikel.
http://techblog.en.klab-blogs.com/archives/31093990.html
Alle Bilder im Artikel sind verschwunden. Sie sind in der japanischen Version des Artikels lebendig.
http://dsas.blog.klab.org/archives/2018-02/configure-sql-db.html
Hilfreichster Kommentar
Versuche dies.
db.SetMaxIdleConns(64)
db.SetMaxOpenConns(64)
db.SetConnMaxLifetime(time.Minure)