2016-04-28 18 views
0

Wir haben eine PostgreSQL-Datenbank, um die Daten unserer C++ - Anwendung zu speichern, und wir verwenden libpqxx, um eine Verbindung herzustellen.Effizienz beim Öffnen von PostgreSQL-Datenbankverbindungen

Derzeit öffnen wir eine neue für jede Transaktion, die wir ausführen möchten. Bei der Implementierung erwarten wir, dass wir höchstwahrscheinlich ungefähr vier oder fünf Dutzend Transaktionen pro Minute ausführen, und unsere Anwendung läuft 24x7x365.

Nach dem PostgreSQL architectural fundamentals,

... [der PostgreSQL Serverprozess] beginnt ("Gabeln") ein neuer Prozess für jede Verbindung.

Das klingt für mich wie unser Verfahren zur Herstellung eines neuen pqxx::connection für jede Transaktion zu öffnen ist wirklich ineffizient sind, da wir indirekt ein paar Dutzend neue Prozesse jede Minute Laichen. Ist das etwas, worüber wir uns wirklich Sorgen machen sollten?

Ich sehe here on the PostgreSQL wiki, dass PostgreSQL selbst nicht einen Pool von Client-Verbindungsprozessen verwaltet, so dass es scheint, dass wir uns in der Tat darum kümmern müssen. Wenn ja, gibt es einen "richtigen" Weg, Objekte auf unbestimmte Zeit zu erhalten, so dass ein neuer Prozess nicht jedes Mal verzweigt wird, wenn ich mich mit der Datenbank verbinden muss? Denken Sie daran, dass meine Anwendung den ganzen Tag und jeden Tag ausgeführt werden muss. Daher ist es inakzeptabel, dass meine TCP-Verbindungen nach einer langen Zeit abfallen.

Antwort

1

Was Sie tun, ist ineffizient, aber nicht so drastisch. PostgreSQLs Fork-Kosten sind auf einer Unix-Plattform niedrig; Backends sind ziemlich billig zu erstellen und zu zerstören.

Die Einrichtung, Authentifizierung usw. braucht Zeit, so dass Sie Ihre Transaktionslatenzen erhöhen.

Es wäre vorzuziehen, einen Verbindungspool zu verwenden, entweder In-App oder in einem Proxy wie Pgbouncer. Das heißt, für "ein paar Dutzend Verbindungen pro Minute" wäre ich nicht allzu besorgt, es sei denn, Sie sind mit Lastproblemen konfrontiert. Es ist hässlich, aber es ist einfach nicht so schlimm.

TCP-Verbindungen "fallen" nicht nur nach einer bestimmten Zeit. Sofern Sie nicht hinter einem eingeschränkten statusbehafteten NAT-Router oder einer Firewall stehen, können sie unbegrenzt inaktiv bleiben. Wenn Sie es sind, müssen Sie nur TCP-Keepalives aktivieren. Es gibt keinen wirklichen Grund, eine Verbindung nicht so lange offen zu halten, wie Sie möchten.

In jedem Fall Ihre Anwendung sollte bereits Logik für Verbindungsverlust wiederholen weil Backends aufgrund Admin Aktion sterben kann, ein PostgreSQL-Server Crash Recovery und neu starten, Bugs, Erschöpfung Server-Ressource verursacht OOM usw. Nie Feuer und vergiss eine Transaktion. Ihre App sollte sich an den vollständigen Status erinnern, der erforderlich ist, um den gesamten xact von Anfang an wiederherzustellen, bis er eine Bestätigung erhält, dass der xact aus der DB committed hat. Wenn bei irgendeinem Schritt ein Fehler auftritt, sollte es in der Lage sein, die Verbindung wiederherzustellen und es erneut zu versuchen.

+0

Vielen Dank für Ihre Antwort. Ich schätze den Input. Ich werde diese Ineffizienz in unserem Code als einen Ort für zukünftige Verbesserungen dokumentieren :) – villapx