Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2009.08.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.006 c
2-1245319255
Fr
2009-06-18 14:00
2009.08.16
Сортировка TListView в виртуальном режиме.


2-1245325239
Дима
2009-06-18 15:40
2009.08.16
Таймер


15-1245353234
DesWind
2009-06-18 23:27
2009.08.16
Это реклама!!!


15-1244644377
Медвежонок Пятачок
2009-06-10 18:32
2009.08.16
сатанисты среди нас


2-1245237512
TheEd
2009-06-17 15:18
2009.08.16
Как принудительно "убить" InplaseEditor в StringGride





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский