Определение мертвых конектов в классике

Материал из GedeminWiki
Перейти к: навигация, поиск

При использовании сервера Firebird классической архитектуры может возникнуть такая проблема: клиент обновил записи, но не закрыл транзакцию, после чего завершился аварийно (выключилось питание, сняли задачу, пропало сетевое соединение и т.п.). Обновленные записи будут заблокированы для изменений другими клиентами, пока не завершится обслуживающий мертвое соединение процесс. Firebird использует функции операционной системы для определения жив еще конект или нет. По умолчанию, Windows начинает проверку через 2 часа после того, как от клиента был принят последний пакет. Параметры ОС можно изменить. Для этого следует зайти в редактор реестра, в раздел:

 \HKEY_LOCAL_MACHINE
  \System
   \CurrentControlSet
    \Services
     \TCPIP
      \Parameters

Создаем (если его еще нет, конечно) следующий параметр:

KeepAliveTime, тип DWORD, значение 300000 -- т.е. проверка будет выполняться через 5 минут с того момента, как клиент послал нам последний запрос.

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

KeepAliveInterval, DWORD, 1000 -- интервал между проверочными пакетами. Пакеты начнут посылаться через KeepAliveTime с момента приема последнего пакета от этого клиента. Максимальное количество проверочных пакетов задается параметром TcpMaxDataRetransmissions. Если ни на один из проверочных пакетов не пришло ответа -- соединение считается потерянным.

TcpMaxDataRetransmissions, DWORD, 5 -- максимальное количество проверочных пакетов.

Таким образом, если прописать KeepAliveTime=300000 и перезагрузить систему, то в случае зависания клиента, максимум через 5 минут и 5 секунд, соединение закроется и блокировка с записей снимется.

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

PS: конечно нагрузка на сеть увеличится. Если зарегистрировано 50 подключений, и все операторы ушли на обед, то за час обеда будет разослано туда: 50 * 12 = 600 и принято 600 пакетов. Всего 1200. Пропускная способность 100 Мб сети -- порядка 1250 восьмикилобайтных пакетов в секунду. Т.е. такая рассылка заберет одну секунду из часа или 1/3600 от общей максимальной пропускной способности сети.

Читать по теме:

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты