| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Firebird, Interbase > Вопрос про возобновление подключения |
| Автор: ksili 10.8.2007, 10:20 | ||||
| Мне нужно, чтобы моя программа нормально отрабатывала пропажу соединения с сервером. То есть: 1) делала всё, что надо при пропаже связи с сервером 2) нормально возобновляла работу при восстановлении связи 3) возможно сюда же относится случай, когда связь есть, но сервак не отвечает (например он перегружен какой-то работой) Пропажу соединения я нормально отлавливаю компонентом TpFibErrorHandler:
Здесь всё нормально, т.к. есть замечательное свойство KindIBError, которое может принимать значение keLostConnect. Но важно также правильно возобновлять работу приложения. На сайте FIBPlus в статье про обработку ошибок БД (http://www.devrace.com/ru/fibplus/articles/4070.php) нашёл следующее:
Наверно, значит в компонентах FIBPlus есть возможность автоматически или нет возобновлять подключение к БД? В свойствах pFIBDatabase1 я такой настройки не нашёл. Значит он автоматически всегда пытается переконнектиться? По-моему всё-таки нет. Как сделать, чтобы приложение нормально возобновляло работу при восстановлении связи И ещё. Надо ли что-то делать, если сервак работает, но прямо сейчас ответить не может (например, перегружен какой-то работой). Вроде среди всевозможных ошибок есть что-то вроде истечения таймаута. Если её просто проигнорировать в обработчике pFibErrorHandler1FIBErrorEvent, будут ли все компоненты, которые работают с базой, просто ждать ответа? |
| Автор: ksili 10.8.2007, 11:43 | ||||||
Нашёл у компонента TpFIBDatabase событие OnLostConnect, в котором можно указать что с этим делать: закрыть приложение, закрыть соединение, проигнорировать, попытаться восстановить соединение. Я ему указываю ждать:
Вроде бы ждёт, и восстанавливает. Но при первом же обращении к БД выскакивает ошибка:
У меня-то диалект третий, что и указано в свойствах компонента TpFIBDatabase. Видимо эти настройки при дисконнекте слетают. Однако попытка восстановить их в обработчике события восстановления коннекта не помогло:
Всё равно выскакивает та же ошибка Добавлено через 6 минут и 2 секунды Перенёс всё из AfterRestoreConnect в BeforeConnect. Вроде помогло |
| Автор: ksili 10.8.2007, 12:53 | ||
| Что-то всё равно не восстанавливает коннект. Все места работы с базой включил в блок:
В результате после остановки Firebirdа в списке служб процессор на 100% загружается моим приложением. А при закрытии ещё и ошибка вылетает. |
| Автор: ksili 11.8.2007, 08:09 | ||||||
| Совсем меня замучала эта тема. ошибки стал обрабатывать так:
Ошибку потери соединения не обрабатываю здесь,т.к. выскочит сообщение, и пока не нажмёшь ОК, приложение будет стоять. А мне надо чтобы оно работало без присутствия человека. с базой работаю в другом потоке:
Функции OnLostConnection и OnBeforeConnect такие:
До выключения сервера всё нормально работает. Затем я выключаю сервер Firebird в службах, жду некоторое время, включаю его назад. Все это время никаких сообщений не выскакивает. Но свойство Connected базы не становится true. Что делать!? Как заставить переконнекчиваться? Добавлено через 14 минут и 13 секунд И при этом, после разрыва связи процессор грузится на 100%. Поток что ли постоянно пытается долбить сервак на предмет соединения? (сервак стоит на этой же машине). Почему тогда загрузка не спадает после того, как Firebird опять запущен? Кроме того я заметил, что собственно тело потока (while(!Terminated) {.........}) после выключения сервера не выполняется. Управление что ли останавливается в функции OnLostConnection? |