Lazarus - IBX - Firebird. Как отследить потерю соединения?

Вопросы программирования и использования среды Lazarus.

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

Ответить
fan.khm
незнакомец
Сообщения: 4
Зарегистрирован: 01.11.2016 18:45:35

Lazarus - IBX - Firebird. Как отследить потерю соединения?

Сообщение fan.khm »

День добрый.

Перешёл с Delphi на Lazarus 1.6
Сервер баз данных - Firebird 2.5
Библиотека для работы с Firebird - IBX 1.4.4
Операционная система Windows x32/x64

Всё хорошо, работает. Возник критический баг - при пропадании соединения с базой данных приложение "рушиться". В приложении есть модули с периодическим (по таймеру) обновлением данных с сервера Firebird.

Надо отследить пропадание связи, подождать появление связи и переподключиться.

Не могу найти / придумать варианты, как это реализовать. Прошу помощи, подсказки
slyubez
постоялец
Сообщения: 186
Зарегистрирован: 31.03.2015 07:44:07

Сообщение slyubez »

Надо отследить пропадание связи, подождать появление связи и переподключиться.

Не могу найти / придумать варианты, как это реализовать. Прошу помощи, подсказки

Исключения обрабатываются?
fan.khm
незнакомец
Сообщения: 4
Зарегистрирован: 01.11.2016 18:45:35

Сообщение fan.khm »

каждый запрос или выполнение процедуры обрамлять try except ?

Добавлено спустя 2 минуты 14 секунд:
Re: Lazarus - IBX - Firebird. Как отследить потерю соединения?
в принципе, если не найдётся ничего более рационального - придётся так и делать
slyubez
постоялец
Сообщения: 186
Зарегистрирован: 31.03.2015 07:44:07

Сообщение slyubez »

каждый запрос или выполнение процедуры обрамлять try except ?

Да, конечно. Других способов нет.
Аватара пользователя
WAYFARER
энтузиаст
Сообщения: 567
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Сообщение WAYFARER »

можно написать ОДНУ процедуру, в которой будет выполняться простой запрос типа

Код: Выделить всё

select 1 from RDB$Database

обрамленный в try except и в случае исключения переподключаться.
А потом просто вызывать эту процедуру в нужным местах.
fan.khm
незнакомец
Сообщения: 4
Зарегистрирован: 01.11.2016 18:45:35

Сообщение fan.khm »

WAYFARER писал(а):можно написать ОДНУ процедуру, в которой будет выполняться простой запрос типа

Код: Выделить всё

select 1 from RDB$Database

обрамленный в try except и в случае исключения переподключаться.
А потом просто вызывать эту процедуру в нужным местах.


ну вот к чему-то такому и начал подготавливаться. муторно конечно... но заглядывать в исходники IBX пока нет времени :)
slyubez
постоялец
Сообщения: 186
Зарегистрирован: 31.03.2015 07:44:07

Сообщение slyubez »

можно написать ОДНУ процедуру, в которой будет выполняться простой запрос типа

Не лучший вариант. Если, к примеру, выполнять процедуру раз в Х секунд, а соединение прервется между исполнениями, получите исключение.
xcod
постоялец
Сообщения: 108
Зарегистрирован: 07.08.2009 12:37:23

Сообщение xcod »

в FIBPlus реализовано отслеживание потери соединения
можно глянуть в исходники)
slyubez
постоялец
Сообщения: 186
Зарегистрирован: 31.03.2015 07:44:07

Сообщение slyubez »

Вообще-то мы говорим про IBX, а не про сдохшие дельфийские FIBы.
xcod
постоялец
Сообщения: 108
Зарегистрирован: 07.08.2009 12:37:23

Сообщение xcod »

какая разница
по крайней мере там это было хорошо реализовано
сам пользовался delphi+fibplus
пока на лазаря не перешел
slyubez
постоялец
Сообщения: 186
Зарегистрирован: 31.03.2015 07:44:07

Сообщение slyubez »

какая разница
по крайней мере там это было хорошо реализовано

Разница в реализации и в архитектуре. Так, как сделано в ФИБах, в IBX сделать проблематично - нужно перекраивать архитектуру. Да и ФИБовская реализация подходит не для всех парадигм программирования.
Аватара пользователя
*Rik*
постоялец
Сообщения: 453
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал
Контактная информация:

Сообщение *Rik* »

TIBDatabase.TestConnection не пробовали вызывать? Если связь пропала TestConnection вызывает TIBDatabase.ForceClose

if IBDatabase1.TestConnection then
begin
//Соединение есть делаем что должны
end
else
begin
//Соединения нет переподключаемся
end;
Последний раз редактировалось *Rik* 05.11.2016 18:05:51, всего редактировалось 3 раза.
xcod
постоялец
Сообщения: 108
Зарегистрирован: 07.08.2009 12:37:23

Сообщение xcod »

slyubez писал(а):
какая разница
по крайней мере там это было хорошо реализовано

Разница в реализации и в архитектуре. Так, как сделано в ФИБах, в IBX сделать проблематично - нужно перекраивать архитектуру. Да и ФИБовская реализация подходит не для всех парадигм программирования.

я вам не говорю "тырить" код один в один
а просто посмотреть реализации алгоритма
баз данных то одна и та же
fan.khm
незнакомец
Сообщения: 4
Зарегистрирован: 01.11.2016 18:45:35

Сообщение fan.khm »

xcod писал(а):какая разница
по крайней мере там это было хорошо реализовано
сам пользовался delphi+fibplus
пока на лазаря не перешел


согласен. тоже Delphi+FIB-ы использовал

Добавлено спустя 38 секунд:
*Rik* писал(а):TIBDatabase.TestConnection не пробовали вызывать? Если связь пропала TestConnection вызывает TIBDatabase.ForceClose

if IBDatabase1.TestConnection then
begin
//Соединение есть делаем что должны
end
else
begin
//Соединения нет переподключаемся
end;


нет. сейчас проверю
Ответить