Postgresql имеет 3 настройки проверки активности для управления выделенными соединениями (в postgresql.conf):
tcp_keepalives_count
tcp_keepalives_idle
tcp_keepalives_interval
По умолчанию это 0.
Поведение, которое я хотел бы, состоит в том, чтобы Postgresql отбросил соединения клиента после промежутка времени, должен клиент терять его сетевое соединение или заснуть.
Я в настоящее время использую эти значения:
tcp_keepalives_count = 1
tcp_keepalives_idle = 60
tcp_keepalives_interval = 60
Я выполняю PostgreSQL 8.4 на Mac OS X, но это, кажется, не имеет эффекта. Мой тест - то, что я блокирую строку в таблице (использующий ИЗБРАННЫЙ FOR UPDATE) и разъединяю рабочую станцию от сети. Но в Postgresql я все еще вижу что рабочая станция, содержащая блокировку.
Я ожидал бы, что после того, как время передало (60 секунд в этом случае), соединение было бы завершено, и блокировка будет выпущена.
Или я делаю что-то не так, или я полностью неправильно понимаю, как это, как предполагается, работает.
Совет?
Я думаю, вам нужно вместо этого настроить операционную систему. Изменение параметров поддержки активности программами пока не имеет широкой поддержки. Это должно помочь вам:
Использование TCP keepalive для обнаружения сетевых ошибок
Также ваши параметры выбраны неправильно. Если tcp_keepalives_count = 1
работал, то даже один потерянный пакет keepalive разорвет ваше соединение. И отдельные пакеты часто теряются. Я бы использовал следующее в /etc/sysctl.conf
на MacOSX / FreeBSD:
net.inet.tcp.keepidle = 60000
net .inet.tcp.keepintvl = 10000
ОС будет разрывать соединения максимум за 140 секунд (60 секунд простоя + 8 пакетов поддержки активности с 10-секундными интервалами) после потери соединения.