it-swarm.com.de

Ist es möglich, das Zeitlimit auf dem Postgres-Server zu begrenzen?

Ich habe in meiner Anwendung (clientseitig) das Zeitlimit für Verbindung und Befehl auf 10 Minuten festgelegt.

Dann führt meine Anwendung eine einfache Abfrage aus: SELECT pg_sleep(65)

Auf einigen Servern funktioniert es einwandfrei, aber andere Server schließen die Verbindung nach 60 Sekunden.

Könnte dies eine Art PostgreSQL-Serverkonfiguration sein, die Zeitüberschreitungen begrenzt und meine Clienteinstellungen ignoriert?

20
Andrzej Gis

Ja es ist möglich

Es gibt zwei in den Dokumenten erwähnte Einstellungen (idle_in_transaction_session_timeout ist neu in Version 9.6x)

  • statement_timeout (Ganzzahl)

    Brechen Sie alle Anweisungen ab, die länger als die angegebene Anzahl von Millisekunden dauern, beginnend mit dem Zeitpunkt, an dem der Befehl vom Client auf dem Server eintrifft. Wenn log_min_error_statement auf ERROR oder niedriger gesetzt ist, wird auch die Anweisung protokolliert, deren Zeitüberschreitung abgelaufen ist. Ein Wert von Null (Standardeinstellung) deaktiviert dies.

    Das Festlegen von statement_timeout in der Datei postgresql.conf wird nicht empfohlen, da dies alle Sitzungen betreffen würde.

  • idle_in_transaction_session_timeout (Ganzzahl)

    Beenden Sie jede Sitzung mit einer offenen Transaktion, die länger als die angegebene Dauer in Millisekunden inaktiv war. Dadurch können alle von dieser Sitzung gehaltenen Sperren freigegeben und der Verbindungssteckplatz wiederverwendet werden. Außerdem können nur für diese Transaktion sichtbare Tupel gesaugt werden. Weitere Informationen hierzu finden Sie in Abschnitt 24.1.

    Der Standardwert 0 deaktiviert diese Funktion.

Es ist wichtig, nicht das statement_timeout in postgresql.conf, es sei denn, Sie möchten sich amüsieren.

Hier ist ein Beispiel dafür, wie es funktioniert

SET statement_timeout = 10000;
SET
test=# SELECT pg_sleep(15);
ERROR:  canceling statement due to statement timeout
34
Evan Carroll

Nicht sofort einsatzbereit. Es wäre jedoch ziemlich einfach, einen benutzerdefinierten Server zu kompilieren, der Ihre Einstellungen ignoriert.

Viel wahrscheinlicher ist es jedoch, dass Ihre Verbindungen von einer Firewall oder einem Gateway getrennt werden, die keine inaktiven Verbindungen mögen.

Wenn Sie Zugriff auf die Protokolldatei des Servers haben, sollte dies einen guten Hinweis geben. Wenn der Client sagt, dass der Server die Verbindung unerwartet geschlossen hat und der Server sagt, dass der Client die Verbindung unerwartet geschlossen hat, ist es wahrscheinlich etwas zwischen dem Client und dem Server, das die Verbindung tatsächlich trennt.

4
jjanes