Есть ли способ разорвать потерянные или неактивные соединения TCP / IP в PostgreSQL 8.4 в Windows Server 2008? - PullRequest
0 голосов
/ 30 июля 2010

Я спросил: Как разорвать соединения TCP / IP с помощью keepalive postgreSQL, ничего не изменяя в реестре?

А теперь я хочу подтвердить:

Моя система (C # .NET, NHibernate и Active Record) работает с базой данных PostgreSQL 8.4 и Windows Server.Мне нужен способ разорвать простаивающие или потерянные соединения TCP / IP и разблокировать данные.

Я не могу ни подправить настройки ОС, ни перекомпилировать PostgreSQL.Моя система может работать в Oracle 10g Express, если это необходимо!Мне нужно знать: могу ли я нарушить бездействующие соединения, не внедрив новый патч для PostgreSQL?Нужно ли мне перенести мою базу данных в Oracle для этого?

Спасибо,

Ответы [ 2 ]

1 голос
/ 31 июля 2010

Если есть способ заставить каждое новое соединение выполнять запрос во время соединения, вы можете написать функцию базы данных, которая динамически вызывает «pg_terminate_backend (pid)» для любых процессов, которые находятся в некоторых критериях. Не зная вашей настройки, некоторые возможности:

  • Соединения с current_query = 'в транзакции' и CURRENT_TIMESTAMP - query_start () больше некоторого значения (от 1 минуты до 5 минут?)
  • Соединения с вашего IP-адреса или индивидуального имени пользователя (если есть), которые вы в данный момент не используете (хотя, вероятно, не очень хорошая идея в средах с пулами соединений)

Лично я бы попытался провести рефакторинг, чтобы минимизировать время, в течение которого любая транзакция может быть открыта. В некоторых местах, где транзакция может быть открыта без необходимости, повышается вероятность возникновения вашей проблемы:

  • ORM работает с выключенным AutoCommit.
  • LOCK используется, когда данные считываются для экрана редактирования, поэтому данные не могут быть обновлены до их обратной записи. Может быть приемлемо проверить, прежде чем написать, что конфликта нет.
  • Транзакции начались перед задачей, не связанной с базой данных, например, процессом FTP или электронной почтой, а затем были закрыты.
  • Транзакции, в которых самым первым оператором является SELECT без предложения блокировки (например, «FOR UPDATE»). Результат этого SELECT будет одинаковым независимо от того, находится он внутри или вне транзакции, поэтому это показатель того, что транзакция была начата слишком рано и может быть сокращена.
  • Транзакции, которые содержат только одно утверждение любого вида.
1 голос
/ 31 июля 2010

Вы ищете pg_cancel_backend () или pg_terminate_backend ()?

Проверьте http://www.postgresql.org/docs/current/static/functions-admin.html

...