libpq Postgres PQexecParams тайм-аут 2 часа

Я использую libpq v9.6.8 для своего приложения (работает круглосуточно и без выходных), которое вставляет данные в базу данных postgres. Я также запускаю PQexecParams, чтобы получить столбцы таблицы. Но случайным образом (иногда раз в неделю, а то и два раза в выходные) этот блокирующий PQexecParams вызов каким-то образом возвращается примерно через 2 часа. В течение этих двух часов мое приложение просто зависает... Вставки выполняются через асинхронный PQsendQueryParams.

Есть ли способ настроить тайм-аут для PQexecParams (поскольку я не могу найти подходящие настройки тайм-аута в lib, возможно, на сервере postgres)? Есть ли лучший способ выполнить синхронный выбор?

заранее спасибо


person Tobi    schedule 12.04.2018    source источник


Ответы (1)


Два часа указывают на то, что срабатывает TCP keepalive и определяет, что соединение ухудшилось.

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

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

person Laurenz Albe    schedule 12.04.2018
comment
Спасибо за подсказку с keepalives_idle, я проведу тест с этой опцией. Поскольку у меня нет доступа к конфигу сервера postgres, я не могу изменить уровень журнала, а с текущим уровнем я не вижу никаких ошибок. - person Tobi; 12.04.2018
comment
к сожалению, я должен указать, что у меня снова была та же ошибка, но на этот раз через 2 часа ничего не произошло, а через 6 часов вызов все еще блокировал приложение. Я установил keepalives_idle на 5... есть еще советы? - person Tobi; 20.04.2018
comment
Возможно дело не в сети, а в блокировке. Вы пишете о параллельных вставках: ваш PQexecParams только выбирает или также изменяет данные? Тогда было бы неплохо взглянуть на pg_locks и установить log_lock_waits = on. Во всяком случае, попытайтесь узнать, что делает внутренний процесс для этого сеанса. Он все еще там? Он потребляет процессор или нет? Он проявляет активность, когда вы прикрепляете к нему strace? - person Laurenz Albe; 20.04.2018