Можно ли ограничить время ожидания на сервере 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

Не из коробки. Было бы довольно легко скомпилировать собственный сервер, который игнорировал бы ваши настройки.

Но гораздо более вероятно, что ваши соединения разрываются межсетевым экраном или шлюзом, который не любит пустые соединения.

Если у вас есть доступ к лог-файлу сервера, это должно дать вам хорошую подсказку. Если клиент говорит, что сервер неожиданно закрыл соединение, а сервер говорит, что клиент неожиданно закрыл соединение, то это, вероятно, что-то среднее между клиентом и сервером, который фактически разрывает соединение.

jjanes
источник
Это определенно не пользовательский скомпилированный сервер - просто обычный материал от apt-get. Не могли бы вы разработать более подробные сведения о межсетевом экране и шлюзе? Как я могу проверить и исправить это?
Анджей Гис
-2

Да, это возможно. Есть несколько параметров подключения, которые вам нужно установить.

Пожалуйста, обратитесь по ссылке ниже. https://jdbc.postgresql.org/documentation/head/connect.html

loginTimeout connectTimeout socketTimeout cancelSignalTimeout

Кавита Патил
источник
2
Это настройки для клиентской стороны соединения с базой данных, а не настройки, которые можно настроить на сервере для отключения клиента. OP ищет настройки тайм-аута соединения на стороне сервера.
Джон aka hot2use