Чи можна обмежити тайм-аут на сервері Postgres?


17

В моїй програмі (клієнтська частина) я встановив час очікування з'єднання та команди на 10 хвилин.

Тоді мій додаток виконує простий запит: SELECT pg_sleep(65)

На деяких серверах він працює чудово, але інші сервери закривають з'єднання через 60 секунд.

Чи може це бути якась конфігурація сервера PostgreSQL, яка обмежує тайм-аути та ігнорує мої налаштування клієнта?


Щоб побачити поточний час очікування:SHOW statement_timeout;
Користувач

Відповіді:


27

Так, це можливо

У документах згадано два налаштування ( idle_in_transaction_session_timeoutнове для версії 9.6x)

  • statement_timeout (ціле число)

    Відмовтесь від будь-якого оператора, який займає більше зазначеної кількості мілісекунд, починаючи з моменту надходження команди на сервер від клієнта. Якщо для параметра log_min_error_statement встановлено значення ERROR або нижче, виписка, що вичерпалася, також буде записана. Значення нуля (за замовчуванням) це вимикає.

    Налаштування statement_timeout у postgresql.conf не рекомендується, оскільки це вплине на всі сеанси.

  • idle_in_transaction_session_timeout (ціле число)

    Завершіть будь-який сеанс відкритою транзакцією, яка не працює в режимі очікування довше зазначеної тривалості в мілісекундах. Це дозволяє звільнити будь-які блокування, проведені до цього сеансу, і повторно використати слот для з'єднання; це також дозволяє пилососити кортежі, видимі лише для цієї транзакції. Детальніше про це див. У Розділі 24.1.

    Значення за замовчуванням 0 відключає цю функцію.

Важливо не встановлювати statement_timeoutв postgresql.conf, якщо ви не хочете розваг.

Ось приклад її роботи

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

Жоден параметр не присутній у конфігураційному файлі, тому я використовую параметри за замовчуванням. :( Будь-які інші ідеї?
Анджей Гіс

@gisek впевнений, це може бути щось на рівні мережі, або у вашому локальному стеку IP або в брандмауері.
Еван Керролл

4

Не з коробки. Було б досить легко скласти власний сервер, який ігнорував ваші налаштування.

Але набагато більше шансів на те, що ваші з'єднання перервано брандмауером або шлюзом, який не любить непрацюючі з'єднання.

Якщо у вас є доступ до файлу журналу сервера, це повинно дати добру підказку. Якщо клієнт каже, що сервер несподівано закрив з'єднання, а сервер каже, що клієнт несподівано закрив з'єднання, то, мабуть, щось середнє між клієнтом і сервером, що насправді розриває з'єднання.


Це точно не призначений для користувача компільований сервер - просто звичайні речі з apt-get. Чи можете ви, будь ласка, розробити більш пристойні брандмауери та шлюзи? Як я можу це перевірити та виправити?
Анджей Гіс

-2

Так, можливо. Є кілька параметрів підключення, які потрібно встановити.

Перейдіть за посиланням нижче. https://jdbc.postgresql.org/documentation/head/connect.html

loginTimeout connectTimeout socketTimeout cancelSignalTimeout


2
Це налаштування для клієнтської частини підключення до бази даних, а не налаштування, які можна налаштувати на сервері для відключення клієнта. OP шукає налаштування часу очікування з'єднання на стороні сервера.
Джон ака hot2use
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.