Golang, mysql: Error 1040: Zu viele verbindungen
Bin ich mit dem github.com/go-sql-driver/mysql Treiber für die go.
Ich eine Datenbank öffnen:
db, err := sql.Open("mysql", str)
Dann habe ich zwei Funktionen, die aufgerufen werden, 200-mal mit jeweils folgenden mysql code:
rows, err := db.Query("select name from beehives")
if err != nil {
panic(err)
}
defer rows.Close()
Zweiten:
err = db.QueryRow("select id, secret, shortname from beehives where shortname = ?", beehive).Scan(&id, &secre
switch {
case err == sql.ErrNoRows:
err = errors.New("Beehive '"+beehive+"' not found.")
case err != nil:
panic("loginBeehive: "+ err.Error())
default:
//... do the work
Die erste ist panicing.
Wie kann es mehr als eine Verbindung, wenn ich öffnen Sie die Datenbank nur einmal und wie schließe ich Sie?
Du musst angemeldet sein, um einen Kommentar abzugeben.
sql.Öffnen Sie nicht wirklich öffnen Sie eine Verbindung zu Ihrer Datenbank.
Sql.DB verwaltet einen pool von verbindungen zu Ihrer Datenbank. Jedes mal, wenn Sie Abfragen in Ihrer Datenbank das Programm wird versuchen, eine Verbindung aus diesem pool oder eine neue erstellen, sonst. Diese verbindungen sind als zurück in den pool, sobald Sie Sie schließen.
Dies ist, was
rows.Close()
tut.Ihre
db.QueryRow("...")
tut die gleiche Sache intern beim AufrufScan(...)
.Das grundlegende problem ist, dass Sie zu viele Anfragen, von denen jeder braucht eine Verbindung, aber Sie sind nicht schließen Sie Ihre verbindungen schnell genug sind. So ist Ihr Programm eine neue Verbindung zu erstellen, die für jede Abfrage.
Können Sie begrenzen die maximale Anzahl der verbindungen an, Ihr Programm durch den Aufruf SetMaxOpenConns auf Ihrem sql.DB.
Sehen http://go-database-sql.org/surprises.html für weitere Informationen.
Den
*DB
Objekt, das Sie wieder vonsql.Open
nicht entspricht single Verbindung. Es ist besser durchdacht als ein handle für die Datenbank: es schafft eine Verbindung-pool für Sie.Können Sie die Anzahl der offenen verbindungen mit `(*DB).SetMaxOpenConns und sein paar für Leerlauf-verbindungen.
Also im Grunde das, was hier passiert, ist, dass
db.Query
unddb.QueryRow
versucht zu erwerben, eine Verbindung für sich selbst und das DB-handle, die keine Einschränkungen hinsichtlich der Anzahl von gleichzeitigen verbindungen, so dass Ihr code in Panik wenn es geöffnet wird, mehr als das, was mysql umgehen kann.Versuchen, prepared statements
db.Prepare(query string) (*Stmt, error)
und alsstmt.Query
oderstmt.Exec
und alsstmt.Close
verbindungen wiederverwenden.