Heim > Backend-Entwicklung > Golang > Wie vermeide ich eine Erschöpfung des Postgres-Verbindungspools beim Einfügen von Zeilen in Go?

Wie vermeide ich eine Erschöpfung des Postgres-Verbindungspools beim Einfügen von Zeilen in Go?

Mary-Kate Olsen
Freigeben: 2024-12-13 02:59:09
Original
144 Leute haben es durchsucht

How to Avoid Postgres Connection Pool Exhaustion When Inserting Rows in Go?

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:

  • Verwenden Sie Exec, wenn das Ergebnis des Die Abfrage ist unbedeutend.
  • Rufen Sie „Scan“ in der zurückgegebenen *Zeile auf, um die freizugeben Verbindung.

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

    // ...

}

// ...
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage