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:
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.
Einstellung des TCP-Timeouts "global" - vor dem Import von psycopg2 habe ich hinzugefügt:
%Vor% Einstellung des TCP-Timeouts am Sockel von psycopg.connection
:
aktiviert keepalive für den Socket von psycopg.connection
:
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)
Tags und Links python postgresql timeout tcp psycopg2