Psycopg2 db Verbindung hängt bei verlorener Netzwerkverbindung

8

Problembeschreibung

Ich verwende psycopg2, um eine Verbindung zu meiner PostgreSQL-Datenbank auf einem Remote-Host herzustellen. Ich öffne eine Verbindung und warte auf Anfragen, dann führe ich für jede Anfrage Abfragen über die Verbindung durch und gebe Daten zurück.

Aber wenn die Netzwerkverbindung verloren geht, nachdem die Verbindung bereits geöffnet ist, hängt die nächste Datenbankabfrage und ich muss das Programm manuell beenden.

Details:

  • es hängt mindestens 2 Stunden (ich konnte nicht länger warten)
  • Die Situation "network down" ist eigentlich ein Herunterfahren von VPN (db host ist nur über VPN zugänglich)
  • Ich kann keine asynchrone Verbindung verwenden, weil ich Transaktionen
  • brauche
  • python 2.6
  • psycopg 2.2.1
  • debian linux 6 und 7, 64bit
  • postgresql 8.4 und 9.1

Was ich will / brauche

Ich brauche eine zuverlässige Methode, um eine fehlgeschlagene Verbindung zu erkennen , bevor eine Abfrage ausgeführt wird, sodass mein Programm nicht hängen bleibt oder dass cursor.execute(..) bei fehlgeschlagener Verbindung eine Ausnahme auslöst.

Beispiel:

%Vor%

Was habe ich versucht (und was nicht funktioniert):

  • Einstellung des TCP-Timeouts "global" - vor dem Import von psycopg2 habe ich hinzugefügt:

    %Vor%
  • Einstellung des TCP-Timeouts am Sockel von psycopg.connection :

    %Vor%
  • aktiviert keepalive für den Socket von psycopg.connection :

    %Vor%
Jan Spurny 04.11.2014, 17:19
quelle

2 Antworten

1

Wir haben uns das Socket-Timeout angeschaut und nach dem Lesen dieses und das , diese Einstellungen funktionierten für mich

%Vor%     
Gabriel Salla 08.06.2017 11:36
quelle
0

Um sicherzustellen, dass eine Verbindung noch gültig ist, lesen Sie die Eigenschaft connection.isolation_level . Dies wird eine OperationalError mit pgcode == "57P01" auslösen, falls die Verbindung tot ist.

try: connection.isolation_level except OperationalError as oe: conn = psycopg2.connect(dsn)

    
Diptesh Chatterjee 05.12.2014 03:13
quelle