Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.16;
Скачать: CL | DM;

Вниз

Обработка подключения когда недоступен удаленный сервер БД.   Найти похожие ветки 

 
Aristarh ©   (2008-11-06 16:40) [0]

В самом общем случае подключение к БД происходит так:

procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
 with TIniFile.Create("ini file") do
   try
     pFIBDatabase1.DBName                 := ReadString("DB", "path", "");
     pFIBDatabase1.ConnectParams.UserName := ReadString("DB", "username", "");
     pFIBDatabase1.ConnectParams.Password := ReadString("DB", "password", "");
   finally
     Free;
   end; // try

 try
   pFIBDatabase1.Open;
 except
   ...
 end;
end;


Проблема или правильнее сказать "неудобство" возникает тогда, когда не удается по сети подключиться к удаленной машине-серверу. В этом случае программа висит на строчке pFIBDatabase1.Open секунд 45 и только после истечения этого промежутка генерирует исключение и входит в обработчик except.
Для себя я не вижу необходимости ждать аж 45 сек., когда с головой достаточно, например, 5-ти сек., чтобы понять доступна ли удаленная БД.
Вопрос. Как правильно обрабатывать ситуацию, чтобы долго не ждать подключения в случае недоступности удаленного сервера.


 
Anatoly Podgoretsky ©   (2008-11-06 16:41) [1]

> Aristarh  (06.11.2008 16:40:00)  [0]

Поток с таймаутом ожидания 5 секунд


 
Виталий Панасенко   (2008-11-07 09:30) [2]

firebird.conf
# ----------------------------
# Client Connection Settings (Basic)
#
# Seconds to wait before concluding an attempt to connect has failed.
#
# Type: integer
#
#ConnectionTimeout = 180


 
DSKalugin   (2008-11-07 09:59) [3]

>Виталий Панасенко

firebird сервер недоступен, а клиентское ПО не хочет ждать ответа недоступен 45 сек

Т.е. бесполезно что-либо править в конфиге выключенного сервера


 
clickmaker ©   (2008-11-07 10:17) [4]

а у самого pFIBDatabase1 нет каких-либо свойств, управляющих таймаутом?


 
Aristarh   (2008-11-07 12:18) [5]

>Виталий Панасенко   (07.11.08 09:30) [2]

Это совсем не то, хоть на первый взгляд и кажется настройками клиента.

>clickmaker ©   (07.11.08 10:17) [4]

Если такой параметр и есть, то мне он неизвестен. Если же открыть исходник TpFIBDatabase1 и найти место непосредственного вызова функции подключения FirebirdAPI, то в этом месте ничего не говорит о каком-либо механизме ограничения времени ожидания:

 (*
  * Attach to the database, and raise an IB error if
  * the statement doesn"t execute correctly.
  *)
 SV:=StatusVector;
 isc_res:=Call(FClientLibrary.isc_attach_database(SV, Length(FDBName),
                        PChar(FDBName), @FHandle,
                        FDPBLength, FDPB), False);

 if isc_res > 0 then
 begin
   FHandle := nil;
   IbError(Self,Self);
 end;


>Anatoly Podgoretsky ©   (06.11.08 16:41) [1]
>Поток с таймаутом ожидания 5 секунд

Не совсем понимаю как это может помочь... Ну вызовем мы в теле потока ту же самую команду pFIBDatabase1.Open; и что? Поток точно также будет ждать 45 секунд на этой строчке.


 
clickmaker ©   (2008-11-07 12:41) [6]

> Не совсем понимаю как это может помочь

что-то типа
Thread.Resume;
WaitForSingleObject(Thread.Handle, 5000);


 
Aristarh   (2008-11-07 16:56) [7]

Решил задачу следующим простым способом. Предварительно подключаюсь телнетом к серверу БД. Если соединение прошло успешно, тогда можно подключаться и компонентой pFIBDatabase.
(IdTelnet - из набора Indy)


 try
  IdTelnet.Connect(2000);
  if IdTelnet.Connected then begin
    IdTelnet.Disconnect;
    pFIBDatabase1.Open;
  end;
 except
   .....
 end;


Насколько корректен такой способ и какие могут быть подводные камни?

>clickmaker ©   (07.11.08 12:41) [6]
>что-то типа
>Thread.Resume;
>WaitForSingleObject(Thread.Handle, 5000);

А каким образом убивать поток, в котором происходит попытка подключения и который мертво висит 45 секунд?


 
DSKalugin   (2008-11-07 17:05) [8]

а порт в телнете какой указан? 23????
почему не IdTCPClient?


 
Aristarh   (2008-11-07 17:14) [9]

>DSKalugin   (07.11.08 17:05) [8]

Ну разумеется порт не 23))
IdTCPClient может и лучше, его пожалуй и оставлю.


 
Johnmen ©   (2008-11-09 02:45) [10]

45, 45...
Магическое число от белкина...
:)))


 
clickmaker ©   (2008-11-10 12:29) [11]

> А каким образом убивать поток

вот это - WaitForSingleObject - его само убьет



Страницы: 1 вся ветка

Текущий архив: 2009.08.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.011 c
15-1244567146
TUser
2009-06-09 21:05
2009.08.16
Чему равно 3^3^3 (этажерка из трех троек)?


2-1245399366
parasolka
2009-06-19 12:16
2009.08.16
Зафиксировать размаер панели.


15-1244611324
pasha_golub
2009-06-10 09:22
2009.08.16
Не пойму сути компонентов а-ля TTransaction


2-1245048658
Б
2009-06-15 10:50
2009.08.16
Наличие клавиатуры.


6-1205445645
ifrau Randt
2008-03-14 01:00
2009.08.16
NMHTTP