Что произойдет, если процесс установит несколько соединений PostgreSQL и завершит работу, не закрывая их? - PullRequest
1 голос
/ 09 апреля 2019

Я пишу DLL для купленного программного обеспечения.

Программное обеспечение будет выполнять многопоточные вычисления для определенных задач.

Моя задача - вывести относительный результат в базу данных.

Однако из-за ограниченной поддержки программного обеспечения довольно сложно осуществлять многопоточный вывод данных.

Основная проблема в том, что нет информации о последнем выполнении функции DLL.

Следовательно, соединение с базой данных не будет закрыто.

Могу ли я спросить, оставлю ли я соединение открытым и завершу ли процесс, какие будут потенциальные проблемы?

Моя платформа - winserver 2008 и PostgreSQL 10.

1 Ответ

2 голосов
/ 09 апреля 2019

Я не понимаю, какую информацию вы предоставляете, но могу ответить на вопрос:

Если клиентский процесс PostgreSQL умирает без закрытия соединения с базой данных (и TCP), серверный процесс PostgreSQL («бэкэнд-процесс »), что серверы этого соединения не сразу поймут это.

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

Однако, часто внутренний процесс бездействует, ожидая, пока клиент отправит следующий запрос.В этом случае он никогда не заметит, что его партнер умер.В конечном итоге это может привести к исчерпанию max_connections из-за разорванных соединений.

Поскольку это распространенная проблема в сети, TCP предоставляет функцию «keepalive»: когда соединение некоторое время простаивает (2 часапо умолчанию), операционная система отправит так называемый «пакет активности» и будет ждать ответа от другой стороны.Отправка пакетов поддержки активности повторяется несколько раз (по умолчанию 5 раз) с короткими интервалами (по умолчанию 1 секунда), и если ответ не получен, соединение закрывается операционной системой, серверный процесс получает сообщение об ошибке и завершается.

PostgreSQL предоставляет параметры , с помощью которых вы можете настроить следующие параметры на стороне сервера: tcp_keepalives_idle, tcp_keepalives_count и tcp_keepalives_interval.Если вы установите для tcp_keepalives_idle более короткое значение, мертвые соединения будут обнаруживаться и удаляться быстрее за счет небольшого добавленного сетевого трафика.

...