![]() |
|
Модераторы: Akella |
![]()
|
|
| ksili |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: нет Всего: 17 |
Мне нужно, чтобы моя программа нормально отрабатывала пропажу соединения с сервером. То есть:
1) делала всё, что надо при пропаже связи с сервером 2) нормально возобновляла работу при восстановлении связи 3) возможно сюда же относится случай, когда связь есть, но сервак не отвечает (например он перегружен какой-то работой) Пропажу соединения я нормально отлавливаю компонентом TpFibErrorHandler:
Здесь всё нормально, т.к. есть замечательное свойство KindIBError, которое может принимать значение keLostConnect. Но важно также правильно возобновлять работу приложения. На сайте FIBPlus в статье про обработку ошибок БД (http://www.devrace.com/ru/fibplus/articles/4070.php) нашёл следующее:
Наверно, значит в компонентах FIBPlus есть возможность автоматически или нет возобновлять подключение к БД? В свойствах pFIBDatabase1 я такой настройки не нашёл. Значит он автоматически всегда пытается переконнектиться? По-моему всё-таки нет. Как сделать, чтобы приложение нормально возобновляло работу при восстановлении связи И ещё. Надо ли что-то делать, если сервак работает, но прямо сейчас ответить не может (например, перегружен какой-то работой). Вроде среди всевозможных ошибок есть что-то вроде истечения таймаута. Если её просто проигнорировать в обработчике pFibErrorHandler1FIBErrorEvent, будут ли все компоненты, которые работают с базой, просто ждать ответа? -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
||||
|
|||||
| ksili |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: нет Всего: 17 |
Нашёл у компонента TpFIBDatabase событие OnLostConnect, в котором можно указать что с этим делать: закрыть приложение, закрыть соединение, проигнорировать, попытаться восстановить соединение. Я ему указываю ждать:
Вроде бы ждёт, и восстанавливает. Но при первом же обращении к БД выскакивает ошибка:
У меня-то диалект третий, что и указано в свойствах компонента TpFIBDatabase. Видимо эти настройки при дисконнекте слетают. Однако попытка восстановить их в обработчике события восстановления коннекта не помогло:
Всё равно выскакивает та же ошибка Добавлено через 6 минут и 2 секунды Перенёс всё из AfterRestoreConnect в BeforeConnect. Вроде помогло -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
||||||
|
|||||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: нет Всего: 17 |
Что-то всё равно не восстанавливает коннект.
Все места работы с базой включил в блок:
В результате после остановки Firebirdа в списке служб процессор на 100% загружается моим приложением. А при закрытии ещё и ошибка вылетает. -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| ksili |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: нет Всего: 17 |
Совсем меня замучала эта тема.
ошибки стал обрабатывать так:
Ошибку потери соединения не обрабатываю здесь,т.к. выскочит сообщение, и пока не нажмёшь ОК, приложение будет стоять. А мне надо чтобы оно работало без присутствия человека. с базой работаю в другом потоке:
Функции OnLostConnection и OnBeforeConnect такие:
До выключения сервера всё нормально работает. Затем я выключаю сервер Firebird в службах, жду некоторое время, включаю его назад. Все это время никаких сообщений не выскакивает. Но свойство Connected базы не становится true. Что делать!? Как заставить переконнекчиваться? Добавлено через 14 минут и 13 секунд И при этом, после разрыва связи процессор грузится на 100%. Поток что ли постоянно пытается долбить сервак на предмет соединения? (сервак стоит на этой же машине). Почему тогда загрузка не спадает после того, как Firebird опять запущен? Кроме того я заметил, что собственно тело потока (while(!Terminated) {.........}) после выключения сервера не выполняется. Управление что ли останавливается в функции OnLostConnection? -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
||||||
|
|||||||
![]()
|
| Правила форума "Interbase" | |
|
|
Обязательно указание: 1. Версию InterBase (Firebird, Yaffil) 2. Способа доступа (ADO, BDE, IBX и т.д.)
Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Firebird, Interbase | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |