In einfachen Go -Webanwendungen, die Datenbanken wie PostgreSQL verwenden, wird das Timing der Datenbankverbindungssperrung zu einer Überlegung. Hier ist ein tiefes Eintauchen, wann und wie man dies in Anwendungen bearbeitet, die auf unbestimmte Zeit ausgeführt werden.
Problem:
Betrachten Sie den folgenden vereinfachten GO -Web -Anwendungscode:
var db *sql.DB
func main() {
var err error
db, err = sql.Open("postgres", "...")
if err != nil {
log.Fatalf("Couldn't connect to the database: %v", err)
}
http.HandleFunc("/whatever", whateverHandler)
http.ListenAndServe("127.0.0.1:8080", nil)
}
Die Frage stellt sich: Wann sollte die Methode close () auf die DB -Verbindung aufgerufen werden?
antworten:
In diesem speziellen Szenario schließen die Verbindung automatisch, wenn das Programm verlässt. Andere Überlegungen können jedoch die manuelle Handhabung rechtfertigen.
Option 1: Implizite Schließen
Das Programm schließt die Datenbankverbindung, wenn es endet, also ist es nicht notwendig, Close () auszuziehen. Anwendungen in Betracht ziehen, einen anmutigen Server wie github.com/grpc-ecosystem/go-grpc-middleware/server zu verwenden, die nach Erhalt von Signalen aufgeschobene Ressourcenschließungen und sauberes Abschalten erlaubt. Dies ist nützlich für die körnige Kontrolle über den Ressourcenverschluss. Beispielsweise könnte ein Schlusskanal verwendet werden, um Goroutines zur Veröffentlichung von Ressourcen zu benachrichtigen, bevor das Programm beendet wird. Die Auswahl des entsprechenden Ansatzes sorgt für eine ordnungsgemäße Reinigung und verhindert Ressourcenlecks.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3