Wiederverwendbare Postgres-DB-Verbindung für Zeileneinfügungen in Go: Beheben der Erschöpfung des Verbindungspools
Das Ziel besteht darin, eine einzelne, wiederverwendbare Postgres-Datenbankverbindung zu verwenden für Zeileneinfügungen in Go. Der Fehler entsteht dadurch, dass der Code aufgrund der unsachgemäßen Handhabung von Verbindungen versehentlich mehrere Verbindungen öffnet.
Der Verbindungspoolmechanismus von Postgres, sql.DB, verwaltet einen Cache von Verbindungen und nicht eine einzelne Verbindung. Es weist Verbindungen je nach Bedarf dynamisch zu, bis zum maximalen Verbindungslimit des Postgres-Servers. Allerdings werden Verbindungen nicht ordnungsgemäß freigegeben, wenn QueryRow verwendet wird, ohne Scan für den zurückgegebenen Row-Wert aufzurufen.
Das Row-Objekt, das intern eine Rows-Instanz enthält, verwaltet seine eigene Verbindung. Erst wenn Scan aufgerufen wird, wird die Verbindung automatisch freigegeben. Wenn Scan nicht aufgerufen wird, bleibt die Verbindung belegt, sodass DB bei nachfolgenden QueryRow-Aufrufen neue Verbindungen öffnen muss. Wenn dies geschieht, ohne dass Verbindungen freigegeben werden, ist der Pool erschöpft und das Problem tritt auf.
Um dieses Problem zu beheben, können Sie einen der beiden Ansätze wählen:
Hier ist ein überarbeiteter Codeausschnitt, der diese Änderungen enthält:
// ... func main() { // ... // msg handling sqlStatement := ` INSERT INTO heartbeat ("Legend", "Status", "TimeStamp") VALUES (, , ) ` row := db.QueryRow(sqlStatement, Legend, Status, TimeStamp) row.Scan(&dummy) // dummy variable to discard the result // ... } // ...
Dadurch wird sichergestellt, dass Verbindungen umgehend freigegeben werden und verhindert, dass der DB-Verbindungspool erschöpft wird.
Das obige ist der detaillierte Inhalt vonWie vermeide ich eine Erschöpfung des Postgres-Verbindungspools beim Einfügen von Zeilen in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!