Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.5 MB
Время: 0.035 c
3-40866
Term
2003-10-20 16:41
2003.11.13
Как правильно обрабатывать событие OnFilterRecord?


3-41033
Andrey V.
2003-10-15 08:47
2003.11.13
Туманный вопрос про дбгрид


1-41204
Agent[007]
2003-11-01 22:07
2003.11.13
Case ... of <a>:<b>; end;


3-40837
SER
2003-10-16 19:16
2003.11.13
Перенос приложения использующего АДО и Аксесс на другой ПК


1-41381
Denis
2003-10-30 11:53
2003.11.13
Виртуальные и динамические методы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский