Форум: "Базы";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
ВнизНепонятное поведение клиента при потере связи с сервером Найти похожие ветки
← →
VID (2003-10-16 01:01) [0]Раньше я наблюдал эту проблему при работе клиента на платформе win9x. Я думал проблема именно в этой платформе, но нет! Сейчас Win2k а проблема осталась. Дело вот в чём: клиент приконнектился к серверу. А у меня в программе клиента, предумотрена система реконнекта. в случае если сервер вылетает. Итак, коннект прошёл успешно. Теперь я выключаю сервер, (сервер и клиент находятся на разных машинах, когда они находятся на одной - то проблемы не возникает), и клиент через некоторое время понимает что он уже "не при делах" , и начинает реконнект. Ну там пишутся соотв. надписи у меня типа "Попытка восстановления связи...", и всё... клиент намертво и надолго зависает! Через минут 5 он вдруг оживает, вылетает сообщение что Succsesful connection can not be established потому что там что то с сервером и всё такое (хотя почему ваще вылетает это сообщение, ведь не должно... или должно ? Подвопрос: как избежать появление этого сообщения, оно крайне некстати?), и короче после появления этого сообщения замеченоч
то какие то клиенты ещё позволяют нажать кнопку ОК в этом сообщении, и в принципе удачно реконнектятся (к тому времени сервер уже загружен и работает), а некоторые, ЗАВИСАЮТ СНОВА, что даже кнопку ОК в этом сообщении не нажать никак.. короче полная лажа... а платформа WINDOWS 2000.
Клиент - Fibplus 4.8
Реконнект реализован стандартными средствами ФИБа.
Вот выкладки из кода:
procedure TDM.IBDBConnect(Sender: TObject);
begin
.....
IBDB.WaitForRestoreConnect := 10000;
.....
end;
procedure TDM.IBDBLostConnect(Database: TFIBDatabase; E:FIBError;
var Actions: TOnLostConnectActions);
begin
....
IF IBDB.WaitForRestoreConnect > 0 then
begin
Form1.SetConnectStat("Соединение потеряно. Автовосстановление...", bctAllert);
form1.ShowStat("Восстановление", 0);
CloseAllDataSets;
CloseAllForms;
Actions := laWaitRestore;
end
....
end;
procedure TDM.IBDBErrorRestoreConnect(Database:TFIBDatabase; E:EFIBError;var Actions: TOnLostConnectActions);
begin
try Form1.SetConnectStat("Ошибка восстановления соединения. Автовосстановление...", bctAllert); except end;
end;
если клиент находится на машине сервера, то никаких проблем ведь не возникает... клиент просто тихо пытается постоянно реконнектится ,и когда сервер врубается - он просто подключается к нему.
Строка соединения с сервером выглядит таким образом:
SERV:D:\BASE\File.gdb (ещё раз напомню, что речь идёт о соединении с сервером через лок. сеть.)
так же пробовал у себя дома
VID:D:\BASE\File.gdb, т.е. по сути максимальная имитация сетевого соединения, и описанной проблемы не возникает.
При соединении через лок. сеть пробовал также и такой вариант строки соединения:
192.168.1.50:D:\BASE\File.gdb
192.168.1.50 - ip сервера,
но результат такой же...
Если Вы дошли до этого места :), то:
Вопрос 1: Что за фигня нафиг ?! :)
Вопрос 2: Как избежать длинного сообщения которое выкидывает клиента после потери связи с сервером (onLostConnect) ?
← →
kaif (2003-10-16 02:01) [1]А почему вообще связь с сервером теряется?
У меня вот не теряется.
Или это на всякий пожарный?
← →
VID (2003-10-16 04:12) [2]to kaif: Ну во-первых, пути Господни неисповедимы... и оказывается иногда связь с сервером теряется. А во-вторых, что же получается: система реконнекта вроде есть, но работать она не будет что ли ? ;)
В-общем, надо это дело исправить, а не надеяться на чудо, не так ли ? ;)
← →
VID (2003-10-16 12:52) [3]народ
← →
народ (2003-10-16 13:34) [4]звали???
← →
VID (2003-10-16 13:46) [5]флуд в этой ветке не поддерживается.
вся информация о проблеме приведена выше.
помощь "по-теме" от любого желающего принимается.
← →
mOOx_ (2003-10-16 13:58) [6]А почему бы не сделать проще и не повесить попытку соединения на таймер. Будет проще и без ошибок :)
← →
VID (2003-10-16 14:12) [7]to moox_: подробней, пожалуйста..
← →
mOOx_ (2003-10-16 18:22) [8]Ну ты тут всякое
IBDB.WaitForRestoreConnect := 10000;
используешь. А что если взять таймер, установить у него запуск через каждую сек, а на процедуру повесить проверку коннекта. Если он есть, то селяви, а если нет, то попытаться установить его.
← →
VID (2003-10-16 20:44) [9]хм... вообще то именно такой таймер у меня есть, он правда не реализует функцию восстановления соединения, его работа следущая: каждые 10 секунд он проверяет РЕАЛЬНОЕ наличие соединения с серваком с помощью функции TFIBDataBase.ExTestConnected():Boolean;
Так вот таймер, ПРОСТО ВЫЗЫВАЕТ эту функцию, даже не используется результат возвращаемый этой функцией.
А если уж функция ExTestConnected() обнаружит что связи с сервером уже нет, то она сама инициирует все необходимые для этого случая события TFIBDataBase, в данном случае это OnLostConnect (обработчик события приведён выше). А уже в свою очередь в OnLostConnect используется возможность фиба для реконнекта.
Так вот вся проблема в том что, когда сервер уже выключен, а клиент ещё думает что он приконнекчен, и делает очередную проверку ExTestConnected(), где-то:
а) в ходе выполнения функции ExTestConnected;
б) После выполнения функции ExTestConnected (перед вызовом обработчика onLostConnect);
в) или же в самом обработчике OnLostConnect (хотя там нет никаких предпосылок)
происходит нечто, что приводит к зависанию программы, и мне хотелось бы понять причину этого зависания
← →
kaif (2003-10-16 21:57) [10]2 VID © (16.10.03 20:44) [9]
Мой тебе совет: посмотри пошагово, как IBX эту ситуацию отрабатывает. Тогда поймешь, в чем дело. А так - гадать придется.
← →
VID (2003-10-17 00:56) [11]to kaif: Объясни пожалуйста свою мысль поподробней (кстати у меня фибы, не ibx)
← →
VID (2003-10-17 12:50) [12]go up
← →
VID (2003-10-19 12:31) [13]go up
← →
kaif (2003-10-19 14:48) [14]2 VID © (17.10.03 00:56) [11]
С фибами не работал - не знаю. Знаю только, что как раз они много гордились своими умениями отрабатывать разрыв связи.
А вообще ставишь точку останова куда-нибудь внутрь IBDBLostConnect, запускаешь программу из под среды Delphi и дальше создаешь эту ситуацию (останавливаешь сервер). Если у тебя имеется исходный текст компонентов, то далее щелкаешь в IDE Delphi кнопку "Следующий шаг" и так далее (выполняешь программу пошагово), пока не поймешь, где висишь. Но насколько я понимаю, всякие wait используют WaitForSingleObject и тому подобные способы обработки событий, которые по идее как раз и должны впадать в ступор по природе своей.
я бы разбил задачу на несколько более мелких и разбирался бы с каждой проблемой в отдельности:
1. Зафиксировать обрыв связи и выдать/не выдать соотвт.сообщ.
2. Попытаться восстановить связь с небольшим timeout-ом порядка 2 сек. и выдать/не выдать сообщение
и так далее, а потом думал бы, как все это собрать в общую логику.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.036 c