PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Go sql - Umfang der vorbereiteten Anweisung

Vorbereitete Anweisungen sind so, dass Sie sich wiederholende SQL-Befehle ausführen können, die sich beispielsweise nur in Parameterwerten unterscheiden können.

Sie sollen nicht "lang" leben, da eine vorbereitete Anweisung (sie tun es, wenn sie von einer Transaktion aufgerufen wird) eine aktive Datenbankverbindung reservieren kann ("lang" bedeutet, wenn sie nicht verwendet werden; es ist völlig in Ordnung, eine vorbereitete Anweisung viele Male wiederholt auszuführen Mal, auch wenn dies lange dauern wird). Eine Verbindung ist eine teure Ressource und sollte nur so lange wie nötig gehalten werden. Nur indem Sie eine Reihe vorbereiteter Anweisungen erstellen und diese nicht schließen, könnten Ihnen die aktiven/erlaubten Verbindungen ausgehen und dann die weitere Kommunikation mit dem DB-Server blockieren.

Verwenden Sie eine vorbereitete Anweisung, wenn Sie dasselbe insert ausführen möchten , update oder select -Anweisung mit unterschiedlichen Parametern mehrmals in einer (HTTP-)Anforderung. Verwenden Sie keine vorbereitete Anweisung, um Anfragen (HTTP) zu überleben.

In bestimmten Treiberimplementierungen und Datenbankservern können vorbereitete Anweisungen auch Ressourcen betreffen, die auf dem DB-Server selbst zugewiesen sind (nicht in der Go-Anwendung). Beispielsweise kann eine vorbereitete Anweisung auf dem DB-Server vorkompiliert werden, und der Server kann einen Abfrageausführungsplan vorbereiten und ihm bestimmte Ressourcen wie Speicher zuweisen. Diese können dauerhaft reserviert werden, bis die vorbereitete Anweisung geschlossen wird.

Es gibt einen Artikel (gepostet von Myles McDonnell in den Kommentaren unten), der sich mit den Implementierungsdetails von Prepared Statements im Gehen. Es wird erwähnt, dass vorbereitete Anweisungen, wenn sie nicht aus Transaktionen erstellt werden, die Verbindung wieder zum Verbindungspool freigeben, aber bei Bedarf versuchen, dieselben wiederzuverwenden, auf denen sie vorbereitet wurden (denn wenn der DB-Server hilft / auch eine aktive Rolle spielt in der vorbereiteten Anweisung ist es an die Verbindung auf der Serverseite gebunden). Wenn nicht, werden sie sich neu vorbereiten sie bei einer neuen Verbindung (was unerwünschten Leistungsaufwand verursacht).

Alles in allem ist das, was Sie beschreiben, ein funktionierendes Modell, und wenn Sie eine geringe Anzahl vorbereiteter Anweisungen haben, die in vielen nachfolgenden Anfragen benötigt / ausgeführt werden, können sie kürzere Antwortzeiten bedeuten. Aber es bedeutet andererseits auch, dass sie langfristig dazu führen können, dass alle Ihre vorbereiteten Anweisungen auf allen Verbindungen des Pools vorbereitet werden. Entscheiden Sie, ob dies in Ihrem Fall akzeptabel ist.

Im Allgemeinen sollte dies vermieden werden (und die vorbereitete Anweisung vor dem Ende der HTTP-Anforderung geschlossen werden), aber wenn Sie nur wenige davon haben und sie in vielen aufeinander folgenden Anforderungen benötigen, können Sie sie aus dem Anforderungsbereich verschieben .