Czy można ograniczyć limit czasu na serwerze Postgres?


17

W mojej aplikacji (po stronie klienta) ustawiłem limit czasu połączenia i poleceń na 10 minut.

Następnie moja aplikacja uruchamia proste zapytanie: SELECT pg_sleep(65)

Na niektórych serwerach działa dobrze, ale inne serwery zamykają połączenie po 60 sekundach.

Czy może to być jakaś konfiguracja serwera PostgreSQL, która ogranicza limity czasu i ignoruje ustawienia mojego klienta?


Aby zobaczyć bieżący limit czasu:SHOW statement_timeout;
Użytkownik

Odpowiedzi:


27

Tak, to możliwe

Dokumenty zawierają dwa ustawienia ( idle_in_transaction_session_timeoutnowość w wersji 9.6x)

  • statement_timeout (liczba całkowita)

    Przerwij wszelkie instrukcje, które zajmują więcej niż określoną liczbę milisekund, zaczynając od momentu, gdy polecenie dotrze do serwera od klienta. Jeśli log_min_error_statement jest ustawiony na ERROR lub niższy, instrukcja, która przekroczyła limit czasu również zostanie zarejestrowana. Wartość zero (domyślna) wyłącza to.

    Ustawienie Statement_timeout w pliku postgresql.conf nie jest zalecane, ponieważ wpłynęłoby to na wszystkie sesje.

  • idle_in_transaction_session_timeout (liczba całkowita)

    Zakończ każdą sesję otwartą transakcją, która była bezczynna przez czas dłuższy niż określony czas w milisekundach. Umożliwia to zwolnienie wszelkich blokad utrzymywanych przez tę sesję i ponowne użycie gniazda połączenia; pozwala także odkurzyć krotki widoczne tylko dla tej transakcji. Więcej informacji na ten temat znajduje się w sekcji 24.1.

    Domyślna wartość 0 wyłącza tę funkcję.

Ważne jest, aby nie ustawiać statement_timeoutpliku postgresql.conf, chyba że chcesz rozrywki.

Oto przykład jego działania

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

Żadne ustawienie nie występuje w pliku konfiguracyjnym, więc używam wartości domyślnych. :( Jakieś inne pomysły?
Andrzej Gis

@Gisek na pewno, może to być coś na poziomie sieci, albo na lokalnym stosie IP, albo na zaporze.
Evan Carroll

4

Nie po wyjęciu z pudełka. Jednak skompilowanie niestandardowego serwera byłoby dość łatwe, ale zignorowałeś twoje ustawienia.

Ale znacznie bardziej prawdopodobne jest to, że twoje połączenia są przerywane przez zaporę ogniową lub bramę, która nie lubi bezczynnych połączeń.

Jeśli masz dostęp do pliku dziennika serwera, powinno to dać dobrą wskazówkę. Jeśli klient mówi, że serwer nieoczekiwanie zakończył połączenie, a serwer mówi, że klient nieoczekiwanie zamknął połączenie, prawdopodobnie jest to coś pomiędzy klientem a serwerem, które faktycznie przerywa połączenie.


Zdecydowanie nie jest to niestandardowo skompilowany serwer - zwykłe rzeczy z apt-get. Czy możesz prosić o opracowanie większej liczby zapór i ścieżek do bram? Jak mogę to zweryfikować i naprawić?
Andrzej Gis,

-2

Tak to mozliwe. Istnieje kilka parametrów połączenia, które należy ustawić.

Proszę zapoznać się z linkiem poniżej. https://jdbc.postgresql.org/documentation/head/connect.html

loginTimeout connectTimeout socketTimeout cancelSignalTimeout


2
Są to ustawienia po stronie klienta połączenia z bazą danych, a nie ustawienia, które można skonfigurować na serwerze w celu rozłączenia klienta. OP szuka ustawień limitu czasu połączenia po stronie serwera.
John aka hot2use,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.