Go / Golang sql.DB Wiederverwendung in Funktionen

8

sql.Open () gibt eine Variable vom Typ * sql.DB

zurück

Ich habe eine Funktion, die 10 andere Funktionen aufruft, die alle Datenbankaufrufe machen müssen

Ist es richtiger / effizienter:

  • Senden Sie den Zeiger * sql.DB an jede Funktion oder
  • Erstellen Sie ein neues * sql.DB-Objekt in jeder Funktion

Bedeutung

%Vor%

oder

%Vor%

Der Grund, warum ich frage, ist, weil ich derzeit den Zeiger auf jede Funktion sende und mein Treiber scheint zu brechen. Ich benutze Ссылка , was zu der Annahme führt, dass jede Funktion ihre eigene hat und dass ich mich auf die des Fahrers verlassen kann Einbauten.

BEARBEITEN

RE-Treiber-Bruch, es passiert nur in Umgebungen mit hohem Verkehrsaufkommen. Und es passiert erst nach etwa zehn Minuten. Was mich zu der Annahme verleitet, dass es eine Art Speicherleck gibt, das dazu führt, dass der Treiber nicht mehr funktioniert. Allerdings verzögere ich db.Close () für jede Instanz von * sql.DB, also weiß ich nicht, was ich noch tun kann, um dieses Problem zu lösen.

andybalholm sagt, dass das Verbindungs-Pooling intern behandelt wird, was genau zu sein scheint, weil es nur bricht, nachdem ich versuche, etwas auszuführen, nicht, wenn ich sql.Open ()

aufruft

Wenn ich meine Go-App laufen lasse, kann sie keine SQL-Abfragen ausführen, aber wenn ich versuche, andere Go-Tests separat zu MSSQL auszuführen und Abfragen auszuführen, funktioniert es.

    
Allison A 14.11.2013, 12:41
quelle

2 Antworten

6

Sie sollten die Datenbankverbindungen nicht überall öffnen müssen. Das Paket database / sql führt das interne Verbinden von Verbindungen durch, indem es Verbindungen nach Bedarf öffnet und schließt und gleichzeitig die Illusion einer einzelnen Verbindung bereitstellt, die gleichzeitig verwendet werden kann.

Wahrscheinlich müssen Sie woanders nach der Ursache Ihres Treiberbruchs suchen. Einige Details dazu würden es den Leuten leichter machen herauszufinden, was vor sich geht.

    
andybalholm 14.11.2013, 19:23
quelle
18

Deklarieren Sie eine var db *sql.DB global und verwenden Sie sie anschließend in Ihrem Code erneut. Hier ist ein Beispiel (vereinfacht):

%Vor%

Wenn Sie *sql.DB global deklarieren, haben Sie auch einige zusätzliche Vorteile wie SetMaxIdleConns (Regeln der Größe des Verbindungspools) ) oder Erstellen von SQL-Anweisungen in Ihrer Anwendung.

    
Kavu 14.11.2013 12:52
quelle

Tags und Links