Выполнение запроса Postgres выполняется с использованием режима гибернации, который отбрасывается, если запрос занимает много времени без каких-либо исключений тайм-аута

Я выполняю запрос postgres, который занимает более двух часов. Этот запрос выполняется с помощью Hibernate в Java-программе. Примерно через 1,5 часа запрос перестает отображаться в состоянии сервера в pg_admin.

Так как запрос исчез из списка активных запросов в базе данных, я ожидаю, что исключение выполнено или произошел тайм-аут. Но я ничего не получаю (без исключения), и мой поток застрял в состоянии ожидания. Я знаю, что запрос не завершен, потому что он должен был выполнить некоторые вставки в таблицу, и я не могу найти ожидаемые строки в таблице.

Я использую pgbouncer для пула соединений и query_timeout отключен. Если бы это был спящий режим, я бы получил исключение. Параметры ОС на компьютере с БД и на клиентском компьютере (компьютер, на котором запущена Java-программа)

  • tcp_keepalive_time - 7200 (секунд)
  • tcp_keepalive_intvl = 75
  • tcp_keepalive_probes = 9 (количество проб) Обе машины работают под управлением операционной системы RHEL. Я не могу указать на этот вопрос.

2 ответа

Решение

Я обнаружил, что проблема была вызвана тем, что TCP-соединение оборвалось, а клиент все еще завис, ожидая ответа.

Я изменил следующие параметры на уровне ОС: -

  • / proc / sys / net / ipv4 / tcp_keepalive_time = 2700

Значение по умолчанию было 7200. Это вызывает проверку поддержания активности каждые 2700 секунд вместо 7200 секунд.

Я уверен, что вы уже посмотрели следующие ресурсы:

  1. PostgreSQL Timeout Docs
  2. Тайм-аут PgBouncer (вы уже упоминали).
  3. Параметры времени ожидания Hibernate, если таковые имеются.

Как только это будет сделано (так же, как решение проблем с разрешениями во время новой установки), я рекомендую вам попробовать следующий SQL-код из различных сценариев (приведенных ниже) и выяснить, что на самом деле вызывает этот тайм-аут:

SELECT pg_sleep(7200);
  1. Войдите на сервер (через psql) и посмотрите, истекло ли время ожидания для SQL.
  2. Войдите в PgBouncer (снова через psql) и посмотрите, истекло ли время PgBouncer.
  3. Выполните этот SQL через Hibernate (через PgBouncer) и посмотрите, есть ли время ожидания.

Это должно позволить вам четко определить причину этого.

Другие вопросы по тегам