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


16

In meiner Anwendung (clientseitig) habe ich das Zeitlimit für Verbindungen und Befehle 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 von PostgreSQL-Serverkonfiguration sein, die Zeitüberschreitungen einschränkt und meine Clienteinstellungen ignoriert?


So zeigen Sie das aktuelle Zeitlimit an:SHOW statement_timeout;
Benutzer

Antworten:


26

Ja es ist möglich

In den Dokumenten werden zwei Einstellungen erwähnt ( idle_in_transaction_session_timeoutist neu in Version 9.6x).

  • statement_timeout (ganze Zahl)

    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 eingeht. Wenn log_min_error_statement auf ERROR oder niedriger gesetzt ist, wird auch die Anweisung protokolliert, bei der das Zeitlimit überschritten wurde. Ein Wert von Null (Standardeinstellung) deaktiviert dies.

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

  • idle_in_transaction_session_timeout (ganze Zahl)

    Beenden Sie jede Sitzung mit einer offenen Transaktion, die länger als die angegebene Dauer in Millisekunden inaktiv war. Auf diese Weise können alle von dieser Sitzung gehaltenen Sperren aufgehoben und der Verbindungssteckplatz erneut verwendet werden. Außerdem können Tupel, die nur für diese Transaktion sichtbar sind, abgesaugt werden. Weitere Informationen hierzu finden Sie in Abschnitt 24.1.

    Der Standardwert 0 deaktiviert diese Funktion.

Es ist wichtig, die in postgresql.conf nicht zu setzen, es statement_timeoutsei denn, Sie möchten sich amüsieren.

Hier ist ein Beispiel dafür

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

Keine der Einstellungen ist in der Konfigurationsdatei vorhanden, daher verwende ich Standardeinstellungen. :( Irgendwelche anderen Ideen?
Andrzej Gis

@gisek sicher, es könnte etwas auf Netzwerkebene sein, entweder in Ihrem lokalen IP-Stack oder an der Firewall.
Evan Carroll

4

Nicht out of the box. 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 angibt, dass der Server die Verbindung unerwartet geschlossen hat, und der Server angibt, dass der Client die Verbindung unerwartet geschlossen hat, liegt wahrscheinlich etwas zwischen dem Client und dem Server, das die Verbindung tatsächlich trennt.


Es handelt sich definitiv nicht um einen speziell kompilierten Server - es handelt sich lediglich um reguläre Inhalte von apt-get. Könnten Sie bitte näher auf Firewall- und Gateway-Leads eingehen? Wie kann ich das überprüfen und beheben?
Andrzej Gis

-2

Ja, es ist möglich. Es gibt einige Verbindungsparameter, die Sie einstellen müssen.

Bitte beziehen Sie sich auf den folgenden Link. https://jdbc.postgresql.org/documentation/head/connect.html

loginTimeout connectTimeout socketTimeout cancelSignalTimeout


2
Hierbei handelt es sich um Einstellungen für die Clientseite einer Datenbankverbindung und nicht um Einstellungen, die auf dem Server zum Trennen eines Clients konfiguriert werden können. OP sucht nach serverseitigen Einstellungen für das Verbindungszeitlimit.
John aka hot2use
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.