Что произойдет, если процесс установит несколько соединений PostgreSQL и завершится, не закрыв их?

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

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

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

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

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

Таким образом, соединение с базой данных не будет закрыто.

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

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

Соединение postgres будет закрыто, и в файл журнала postgres будет внесена ошибка «клиент отключен». Однако создавать несколько подключений и не закрывать их — определенно ужасная идея. Вероятно, вы превысите лимит подключений и отключите postgres для всех.

404 09.04.2019 10:57

Спасибо @404, но есть ли способ закрыть соединение postgresql извне, которое не активировано ??

Shore 09.04.2019 11:00

Что вы имеете в виду под "не активирован"?

404 09.04.2019 11:03

Скажем, я запускаю процесс и создаю 30 потоков, выделяя каждому потоку соединение с БД. После этого я завершаю процесс, не закрывая соединение с БД. Итак, вы имеете в виду, что после завершения процесса postgresql автоматически закроет соединение с БД ??

Shore 09.04.2019 11:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
482
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

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

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

Привет большое спасибо! Кстати, будет ли способ вручную вызвать эту функцию «keepalive»?

Shore 09.04.2019 11:14

Вы можете использовать функцию pg_terminate_backend для завершения отдельного внутреннего процесса на стороне сервера.

Laurenz Albe 09.04.2019 11:16

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