Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос про возобновление подключения, FIBPlus, TpFibErrorHandler 
:(
    Опции темы
ksili
Дата 10.8.2007, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Мне нужно, чтобы моя программа нормально отрабатывала пропажу соединения с сервером. То есть:
1) делала всё, что надо при пропаже связи с сервером
2) нормально возобновляла работу при восстановлении связи
3) возможно сюда же относится случай, когда связь есть, но сервак не отвечает (например он перегружен какой-то работой)

Пропажу соединения я нормально отлавливаю компонентом TpFibErrorHandler:
Код

void __fastcall TForm1::pFibErrorHandler1FIBErrorEvent(TObject *Sender,
      EFIBError *ErrorValue, TKindIBError KindIBError, bool &DoRaise)
{
 if(KindIBError==keLostConnect)
    {
      ...................
    }

 else
    {
      ...................
    }

 DoRaise = false;
}

Здесь всё нормально, т.к. есть замечательное свойство KindIBError, которое может принимать значение keLostConnect.

Но важно также правильно возобновлять работу приложения. На сайте FIBPlus в статье про обработку ошибок БД (http://www.devrace.com/ru/fibplus/articles/4070.php) нашёл следующее:
Цитата

Компонент TpFibErrorHandler позволяет обрабатывать множество ошибок базы данных. При этом ошибки подключения к базе данных в нем не обрабатываются (не путать с ошибкой при потере подключения и попытках возобновления подключения).

Наверно, значит в компонентах FIBPlus есть возможность автоматически или нет возобновлять подключение к БД? В свойствах pFIBDatabase1 я такой настройки не нашёл. Значит он автоматически всегда пытается переконнектиться? По-моему всё-таки нет. Как сделать, чтобы приложение нормально возобновляло работу при восстановлении связи

И ещё. Надо ли что-то делать, если сервак работает, но прямо сейчас ответить не может (например, перегружен какой-то работой). Вроде среди всевозможных ошибок есть что-то вроде истечения таймаута. Если её просто проигнорировать в обработчике pFibErrorHandler1FIBErrorEvent, будут ли все компоненты, которые работают с базой, просто ждать ответа?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
ksili
Дата 10.8.2007, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Нашёл у компонента TpFIBDatabase событие OnLostConnect, в котором можно указать что с этим делать: закрыть приложение, закрыть соединение, проигнорировать, попытаться восстановить соединение. Я ему указываю ждать:
Код

void __fastcall TMainPropertiesForm::pFIBDatabase1LostConnect(
      TFIBDatabase *Database, EFIBError *E, TOnLostConnectActions &Actions)
{
 Actions = laWaitRestore;
}

Вроде бы ждёт, и восстанавливает. Но при первом же обращении к БД выскакивает ошибка:
Цитата

Client SQL dialect 1 does not support reference to BIGINT datatype

У меня-то диалект третий, что и указано в свойствах компонента TpFIBDatabase. Видимо эти настройки при дисконнекте слетают. Однако попытка восстановить их в обработчике события восстановления коннекта не помогло:
Код

void __fastcall TMainPropertiesForm::pFIBDatabase1AfterRestoreConnect(
      TFIBDatabase *Database)
{
 pFIBDatabase1->ConnectParams->CharSet = "WIN1251";
 pFIBDatabase1->SQLDialect = 3;
 pFIBDatabase1->UseLoginPrompt = false;
}

Всё равно выскакивает та же ошибка

Добавлено через 6 минут и 2 секунды
Перенёс всё из AfterRestoreConnect в BeforeConnect. Вроде помогло


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
ksili
Дата 10.8.2007, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Что-то всё равно не восстанавливает коннект. 
Все места работы с базой включил в блок:
Код

if(MainBase->Connected)
{
..........
}

В результате после остановки  Firebirdа в списке служб процессор на 100% загружается моим приложением. А при закрытии ещё и ошибка вылетает.


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
ksili
Дата 11.8.2007, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Совсем меня замучала эта тема.

ошибки стал обрабатывать так:
Код

void __fastcall TForm1::pFibErrorHandler1FIBErrorEvent(TObject *Sender,
      EFIBError *ErrorValue, TKindIBError KindIBError, bool &DoRaise)
{
 AnsiString S;

 if(KindIBError!=keLostConnect)
    {
     S = "SQLCode = " + IntToStr(ErrorValue->SQLCode) + "\r\n";
     S +="IBErrorCode = " + IntToStr(ErrorValue->IBErrorCode) + "\r\n";
     S +="IBMessage = " + ErrorValue->IBMessage + "\r\n";
     Application->MessageBox(S.c_str(), "Database Error",MB_OK + MB_ICONSTOP);
    }

 DoRaise = false;
}


Ошибку потери соединения не обрабатываю здесь,т.к. выскочит сообщение, и пока не нажмёшь ОК, приложение будет стоять. А мне надо чтобы оно работало без присутствия человека.

с базой работаю в другом потоке:

Код

void __fastcall TPermanentDispatchThread::Execute()
{
........................
 MainBase->OnLostConnect = OnLostConnection;
 MainBase->BeforeConnect = OnBeforeConnect;
........................
 while (!Terminated)
    {
      ..................
      if(MainBase->Connected)
          {
            //здесь обращаюсь к базе
            ...............
          }
      ........................
    }
}

Функции OnLostConnection и OnBeforeConnect такие:
Код

//-------------------------------------------------------------------------

void __fastcall TMyThread::OnLostConnection(
    TFIBDatabase *Database, EFIBError *E, TOnLostConnectActions &Actions)
{
 Actions = laWaitRestore;
}
//-------------------------------------------------------------------------

void __fastcall TMyThread::OnBeforeConnect(
    TFIBDatabase *Database, TStrings *LoginParams, bool &DoConnect)
{
 Database->ConnectParams->CharSet = "WIN1251";
 Database->SQLDialect = 3;
 Database->UseLoginPrompt = false;
}

До выключения сервера всё нормально работает. Затем я выключаю сервер Firebird в службах, жду некоторое время, включаю его назад. Все это время никаких сообщений не выскакивает. Но свойство Connected базы не становится true. Что делать!? Как заставить переконнекчиваться?

Добавлено через 14 минут и 13 секунд
И при этом, после разрыва связи процессор грузится на 100%. Поток что ли постоянно пытается долбить сервак на предмет соединения? (сервак стоит на этой же машине).  Почему тогда загрузка не спадает после того, как Firebird опять запущен?

Кроме того я заметил, что собственно тело потока (while(!Terminated) {.........}) после выключения сервера не выполняется. Управление что ли останавливается в функции OnLostConnection?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.0499 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.