Permanente DB-Verbindung in postgresql?

Hallo zusammen,

ich brauche wieder mal ein Tipp von euch.

Ich habe eine plpgsql-Prozedur auf einer postgresql-Datenbank installiert, die unter unix mit einem cronjob jede 5. Minute ausgeführt wird. Die Aufgabe dieser Prozedur ist, Daten von der aktuellen postgresql-DB in eine andere postgresql-DB auf einer anderen Maschine zu transportieren. Dazu benutze ich dblinks (Database Links aus dem Paket postgresql-contrib).

Nun zum Problem: Jedes Mal, wenn die Prozedur per cronjob ausgeführt wird, wird die Verbindung zur entfernten Datenbank zuerst aufgebaut, Daten transportiert und wieder abgebaut. Es ist aber offensichlich, dass dies super uneffizient ist, da jeder Prozeduraufruf die Verbindung zur entfernten Datenbank auf- und wieder abbauen muss.
Wie kann ich mir eine permanente Verbindung aufbauen. Sehr praktisch wäre es ja, nur eine Verbindung aufzubauen, und alle Daten über diese zu transportieren. Ich müsste also theoretisch zuerst die Verbindung aufbauen, danach diese in einer globalen Variable (z.B. boolean connExists) in postgresql-DB speichern und nächstes Mal, wenn die Prozedur wieder ausgeführt wird, überprüfen ob diese Variable connExists auf true gesetzt ist und somit die Verbindung existiert. Aber eine globale Variable in postgresql gibt es doch nicht?

Ich bitte euch um einen Rat.

viele Grüße
hitaf

Hallo hitaf,

um eine permanente Verbindung offen zu halten muesstest du einen Deamon schreiben (d.h. ein Programm, welches dauernd (im Hintergrund) laeuft) welcher die Verbindung offen haelt. Bei der Verwendung von Cronjobs ist dies nicht moeglich.
Allerdings ist das Aufbauen einer neuen Verdbindung imho nicht so kritisch (vor allem wenn es nur alle 5min geschieht) als das man dies nicht so, wie du es bist jetzt hast, belassen koennte.

Gruesse
Stefan

Hallo Stefan,

vielen Dank für die schnelle Antwort. Die Idee mit dem Deamon hört sich sehr gut an. D.h. ich schreibe z.B. ein C-Programm, das die Verbindung zur entfernten postgresql aufbaut und immer im Hintergrund läuft. Nur ich muss ja irgendwie in der plpgsql-Prozedur auf die von Deamon aufgebaute Verbindung Referenz nehmen. Also z.B. Daemon hat die permanente Verbinung aufgebaut und sie heißt beispielsweise conn1. Wenn ich dann in der plpgsql - Prozedur eine „insert into“ Anweisung schicken möchte, muss ich ja die Adresse angeben wo diese „insert into“ - Anweisung geschrieben werden soll. Kann ich an dieser Stelle dann einfach conn1 angeben (ist dieser Name also im gesamten System bekannt?).

Ganz konkret: db_execute(conn1,„insert into …“) in postgresql
conn1 ist dabei die von Daemon aufgebaute Verbindung.

Ich könnte, wie du es ja beschrieben hast, einfach so lassen. In Wirklichkeit brauche ich ja aber nur eine permanente Verbindung und die ständige Auf- und Abbau der Verbindung sieht wie eine unsaubere Lösung aus.

viele Grüße
hitaf

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Stefan,

vielen Dank für die schnelle Antwort. Die Idee mit dem Deamon
hört sich sehr gut an. D.h. ich schreibe z.B. ein C-Programm,
das die Verbindung zur entfernten postgresql aufbaut und immer
im Hintergrund läuft. Nur ich muss ja irgendwie in der
plpgsql-Prozedur auf die von Deamon aufgebaute Verbindung
Referenz nehmen.

Nein. Der Deamon wuerde dann den Cronjob ersetzen und die komplette Arbeit uebernehmen. Du kannst nicht eine Verbindung von einem Programm in einem anderen Programm nutzen (ausser das Programm, welches die Verbindung aufbaut und offen haelt, bietet entsprechende Schnittstellen an)

Ich könnte, wie du es ja beschrieben hast, einfach so lassen.
In Wirklichkeit brauche ich ja aber nur eine permanente
Verbindung und die ständige Auf- und Abbau der Verbindung
sieht wie eine unsaubere Lösung aus.

Nein, ist es nicht. Und sieht auch nicht danach aus. Das ist eigentlich der normale Weg, wie man Datenbanken anspricht.

Gruesse
Stefan

Nein. Der Deamon wuerde dann den Cronjob ersetzen und die
komplette Arbeit uebernehmen. Du kannst nicht eine Verbindung
von einem Programm in einem anderen Programm nutzen (ausser
das Programm, welches die Verbindung aufbaut und offen haelt,
bietet entsprechende Schnittstellen an)

Achso, dann muss der Daemon selber die Prozedur in postgresql-DB in bestimmten Abständen (in diesem Fall jede 5. Minute) ausführen. Alles klar, das wäre dann die Alternative zu meiner jetzigen Lösung.

Nein, ist es nicht. Und sieht auch nicht danach aus. Das ist
eigentlich der normale Weg, wie man Datenbanken anspricht.

ok, vielen Dank für deine Hilfe.

hitaf

Hallo hitaf,

Ich habe eine plpgsql-Prozedur auf einer postgresql-Datenbank
installiert, die unter unix mit einem cronjob jede 5. Minute
ausgeführt wird.

Jedes Mal, wenn die Prozedur per cronjob
ausgeführt wird, wird die Verbindung zur entfernten Datenbank
zuerst aufgebaut, Daten transportiert und wieder abgebaut.

Wie kann ich mir eine permanente Verbindung aufbauen.

Vielleicht hilft dir das hier weiter:
http://asmith.id.au/mod_libpq.html

Viele Grüße
Marvin

Hallo Marvin,

Vielleicht hilft dir das hier weiter:
http://asmith.id.au/mod_libpq.html

danke, wäre auch eine Alternative. Muss mir dann nur noch die bessere aussuchen :smile:.

viele Grüße