Я пишу DLL для купленного программного обеспечения.
Программное обеспечение будет выполнять многопоточные вычисления для определенных задач.
Моя работа состоит в том, чтобы вывести относительный результат в базу данных.
Однако из-за ограниченной поддержки программного обеспечения многопоточный вывод данных затруднителен.
Ключевая проблема в том, что нет информации о последнем выполнении функции DLL.
Таким образом, соединение с базой данных не будет закрыто.
Итак, могу ли я спросить, если я оставлю соединение открытым и завершу процесс, какие могут быть потенциальные проблемы?
Моя платформа — winserver 2008 и PostgreSQL 10.
Спасибо @404, но есть ли способ закрыть соединение postgresql извне, которое не активировано ??
Что вы имеете в виду под "не активирован"?
Скажем, я запускаю процесс и создаю 30 потоков, выделяя каждому потоку соединение с БД. После этого я завершаю процесс, не закрывая соединение с БД. Итак, вы имеете в виду, что после завершения процесса postgresql автоматически закроет соединение с БД ??
Я не понимаю справочную информацию, которую вы даете, но я могу ответить на вопрос:
Если клиентский процесс PostgreSQL завершает работу без закрытия соединения с базой данных (и TCP), серверный процесс PostgreSQL («бэкэнд-процесс»), который обслуживает это соединение, не поймет этого немедленно.
Конечно, как только сервер пытается связаться с клиентом, например. чтобы вернуть некоторые результаты, TCP заметит, что партнер ушел, и вернет ошибку.
Однако часто серверный процесс простаивает, ожидая, пока клиент отправит следующий запрос. В этом случае он никогда не заметит, что его партнер умер. В конечном итоге это может привести к тому, что max_connections
будет исчерпан мертвыми соединениями.
Поскольку это распространенная проблема в сети, TCP обеспечивает функциональность «поддержки активности»: когда соединение какое-то время бездействует (по умолчанию 2 часа), операционная система отправляет так называемый «пакет проверки активности» и ждет ответ с другой стороны. Отправка пакетов поддержки активности повторяется несколько раз (по умолчанию 5 раз) с короткими интервалами (по умолчанию 1 секунда), и если ответ не получен, соединение закрывается операционной системой, бэкенд-процесс получает сообщение об ошибке и завершается.
PostgreSQL предоставляет параметры, с помощью которого вы можете настроить эти параметры на стороне сервера: tcp_keepalives_idle
, tcp_keepalives_count
и tcp_keepalives_interval
. Если вы установите tcp_keepalives_idle
на более короткое значение, мертвые соединения будут обнаруживаться и удаляться быстрее за счет некоторого дополнительного сетевого трафика.
Привет большое спасибо! Кстати, будет ли способ вручную вызвать эту функцию «keepalive»?
Вы можете использовать функцию pg_terminate_backend
для завершения отдельного внутреннего процесса на стороне сервера.
Соединение postgres будет закрыто, и в файл журнала postgres будет внесена ошибка «клиент отключен». Однако создавать несколько подключений и не закрывать их — определенно ужасная идея. Вероятно, вы превысите лимит подключений и отключите postgres для всех.