KeepAlive в клиентском приложении
Модератор: kdv
KeepAlive в клиентском приложении
Имеется многопоточное приложение для репликации данных, которое работает в центральном офисе.
При плохой связи с некоторыми филиалами поток репликации может подвисать из-за длительных обрывов связи.
Сразу хочу уточнить, что проблема НЕ в многопоточности: на каждый поток используется один коннект, подключения к базе сериализованы.
Вопрос в следующем: возможно ли задать параметр KEEPALIVE для клиентского коннекта?
При плохой связи с некоторыми филиалами поток репликации может подвисать из-за длительных обрывов связи.
Сразу хочу уточнить, что проблема НЕ в многопоточности: на каждый поток используется один коннект, подключения к базе сериализованы.
Вопрос в следующем: возможно ли задать параметр KEEPALIVE для клиентского коннекта?
www.ibase.ru/devinfo/keepalive.htmВопрос в следующем: возможно ли задать параметр KEEPALIVE для клиентского коннекта?
Я уже читал эту статью.kdv писал(а):www.ibase.ru/devinfo/keepalive.htmВопрос в следующем: возможно ли задать параметр KEEPALIVE для клиентского коннекта?
Насколько я понял, в ней описывается механизм KEEPALIVE для СЕРВЕРА Firebird (серверному сокету устанавливается параметр SO_KEEPALIVE и при обрыве связи с клиентом и длительном ее отсутствии сервер посылает пакеты для проверки активности клиента, и если клиент вовремя не ответил, он освобождает поток (процесс) выделенный для этого клиента)
В моем случае, репликатор является КЛИЕНТОМ Firebird, но при этом выполняет СЕРВЕРНЫЕ ФУНКЦИИ по репликации данных из филиалов.
В связи с этим мне важно, чтобы клиентские коннекты тоже не провисали из-за обрывов связи, т.е. необходимо, чтобы клиентский сокет также создавался с параметром SO_KEEPALIVE и при длительном отсутствии связи с сервером Firebird проверялась активность серверного сокета и при отсутствии ответа закрывался клиентский сокет.
Буду очень признателен, если вы объясните, в чем я не прав ?!
Возможно я неверно понял указанную выше статью ?!
Не надо придираться к фразам !!!kdv писал(а):если ты ее ЧИТАЛ, то фраза "насколько я понял" неприменима. Тогда читай еще раз.Насколько я понял, в ней описывается механизм
В статье есть единственное упоминание о клиентском коннекте:
Смысл данной настройки абсолютно другой !!!Настройка KEEPALIVE в Windows (для клиентов)
Данная настройка необязательна, но, возможно, позволит уменьшить количество сообщений о потере соединения при использовании ненадежных линий связи. Добавьте в ветку реестра
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
параметр DisableDHCPMediaSense=1 . См. описание данного параметра здесь:
http://support.microsoft.com/?scid =kb%3Bru%3B239924&x=13&y=14
Если бы у меня базы стояли в локалке, и кто-нибудь периодически выдергивал кабели из серверных компов, мне бы эта настройка помогла.
И то, мне бы всего лишь выдавалась ошибка о разрыве связи, а в моем случае клиент "бесконечно" ожидает ответа от уже не существуюшего серверного сокета.
У меня серверы в разных концах Москвы, и соединение идет через несколько VPN, и если какой-нибудь рабочий перекусит оптику по пути, мне эта настрока ничем не поможет.
У меня сложилось впечатление, что вы не читаете моих вопросов, а увидев слово "KEEPALIVE" стандартно, как и всех остальных, отсылаете на выше указанную статью.
А если вы все же прочитали мой вопрос, дайте на него четкий ответ, а то так можно не один месяц препираться
Повторю вопрос еще раз: возможно ли задать параметр KEEPALIVE для КЛИЕНТСКОГО сокета?
Умеет ли библитека gds32 в принципе создавать сокеты с параметром SO_KEEPALIVE?
не надо буйствовать. я когда чего-то не понимаю, беру и еще раз перечитываю, пока понятно не станет. Если непонятно - ищу дополнительную информацию.Не надо придираться к фразам !!!
разумеется, не буду же я ее тут пересказывать. На Вашем нике не написано, что Вы семи пядей во лбу, и в курсе как работает и настраивается механизм keepalive, и Вы не сказали, что читали статью.а увидев слово "KEEPALIVE" стандартно, как и всех остальных, отсылаете на выше указанную статью.
я кому-то чем-то обязан? Вообще статья про keepalive содержит линк наА если вы все же прочитали мой вопрос, дайте на него четкий ответ
How to detetmine loss of client/server connection
http://support.microsoft.com/default.aspx?kbid=140325
если я правильно понял этот линк, настройка относится как к клиенту так и к серверу. Потому что вопрос проверки актуальности соединения (опция keepalive) реализуется стеком tcp.
она или умеет или не умеет. какая именно библиотека?Умеет ли библитека gds32 в принципе создавать сокеты с параметром SO_KEEPALIVE?
gds32.dll или fbclient.dll?
если первое, то
http://dn.codegear.com/ru/article/30362
если второе, то по идее в inet.cpp есть опция keepalive, но я не уверен, что она относится к клиенту. Сервер однозначно открывает сокет с этой опцией, начиная с FB 1.5.
По поводу клиентов и keepalive есть например статья
http://www.experts-exchange.com/Network ... 10829.html
а в отношении клиента FB давайте лучше подождем, что скажут разработчики FB.
независимо от статьи, release notes по FB не упоминают явно что клиентский коннект открывается с этой опцией.Возможно я неверно понял указанную выше статью ?!
-
- Сообщения: 4
- Зарегистрирован: 26 май 2008, 11:45
искал информацию по теме, и первая ссылка была сюда. Но тут нашел неутешительные ответы. К счастью, на трекере firebird нашел более обнадеживающие известия.
может кому будет полезно
может кому будет полезно
http://tracker.firebirdsql.org/browse/CORE-1763Vlad Khorsun - [21/Mar/08 11:43 AM ]
Client socket for database connection now set TCP_NODELAY option (accordingly to firebird.conf setting, by default on).
Client socket for events processing now set SO_KEEPALIVE option