Разрыв соединения
Разрыв соединения
Не совсем ясно как происходит восстановление соединения при разрыве оного. Компонент самостоятельно пытается наладить соединение, или нужно пользоваться специальными методами?
Второй вопрос на счёт события OnConnectionLost. Оно вызывается постоянно, пока соединение не восстановится, тоесть если хочется сообщить пользователю о разрыве соединения сообщением в showmessage, то окошко будет вызываться бесконечное количество раз, пока не произойдёт подключение к базе. Можете дать несколько советов как реализовать информатирование пользователя о проблемах с подключением? Третье, это то, что программа просто зависает если подключения нету, а пользователь пытается сделать выборку данных, а если подключение восстанавливается - программа "развисает", как решить даную проблему? Спасибо заранее
Второй вопрос на счёт события OnConnectionLost. Оно вызывается постоянно, пока соединение не восстановится, тоесть если хочется сообщить пользователю о разрыве соединения сообщением в showmessage, то окошко будет вызываться бесконечное количество раз, пока не произойдёт подключение к базе. Можете дать несколько советов как реализовать информатирование пользователя о проблемах с подключением? Третье, это то, что программа просто зависает если подключения нету, а пользователь пытается сделать выборку данных, а если подключение восстанавливается - программа "развисает", как решить даную проблему? Спасибо заранее
Re: Разрыв соединения
Восстановление соединения происходит только если выполнены следующие условия:
1. опция TMyConnection.Options.LocalFailover установлена в True;
2. переменная RetryMode события OnConnectionLost установлена в значение отличное от rmRaise;
3. нет активных транзакций;
4. нет недофетченных датасетов;
5. нет явно препарированных запросов.
Для того чтобы избежать зависания программы, Вы можете попытаться восстановить соединение несколько раз, и если соединение не может быть восстановлено, прекращать попытки. Например, Вы можете использовать следующий код:В данном случае, MyDAC произведет две попытки восстановить соединение и в случае неудачи сгенерирует исключение. Вы можете перехватывать данное исключение и выводить соответствующее сообщение пользователю.
1. опция TMyConnection.Options.LocalFailover установлена в True;
2. переменная RetryMode события OnConnectionLost установлена в значение отличное от rmRaise;
3. нет активных транзакций;
4. нет недофетченных датасетов;
5. нет явно препарированных запросов.
Для того чтобы избежать зависания программы, Вы можете попытаться восстановить соединение несколько раз, и если соединение не может быть восстановлено, прекращать попытки. Например, Вы можете использовать следующий код:
Код: Выделить всё
var
RetryCount: Integer;
procedure TMainForm.MyConnection1ConnectionLost(Sender: TObject;
Component: TComponent; ConnLostCause: TConnLostCause;
var RetryMode: TRetryMode);
begin
if RetryCount < 2 then begin
Inc(RetryCount);
RetryMode := rmReconnectExecute;
end
else begin
RetryCount := 0;
RetryMode := rmRaise;
end;
end;
Re: Разрыв соединения
Спасибо за ответ. А можно в отдельном потоке пинговать сервер каждые 5-10 секунд и пробывать опять восстановить соединение в фоне?
Re: Разрыв соединения
Можно.
Re: Разрыв соединения
Доброго времени суток!AndreyZ писал(а):Код: Выделить всё
var RetryCount: Integer; procedure TMainForm.MyConnection1ConnectionLost(Sender: TObject; Component: TComponent; ConnLostCause: TConnLostCause; var RetryMode: TRetryMode); begin if RetryCount < 2 then begin Inc(RetryCount); RetryMode := rmReconnectExecute; end else begin RetryCount := 0; [b][color=#BF0040]RetryMode := rmRaise; [/color][/b] end; end;
после выставления rmRaise, уходит в зависон без отжирания памяти.
лечится если в коде проставить FSession.Options.LocalFailover := False
что ни есть удобно. Можете посоветовать, что-нибудь кошерное?
Re: Разрыв соединения
После установке переменной RetryMode в rmRaise в обработчике события OnConnectionLost, при разрыве соединения генерируется исключение, соединение закрывается и событие OnConnectionLost не будет возникать пока вы вручную не попытаетесь соединиться с сервером. При установке TMyConnection.Options.LocalFailover := False событие OnConnectionLost не возникает.
Re: Разрыв соединения
я в курсе этого.ViktorV писал(а):После установке переменной RetryMode в rmRaise в обработчике события OnConnectionLost, при разрыве соединения генерируется исключение, соединение закрывается и событие OnConnectionLost не будет возникать пока вы вручную не попытаетесь соединиться с сервером. При установке TMyConnection.Options.LocalFailover := False событие OnConnectionLost не возникает.
но вопрос был следующий:
почему после выхода из OnConnectionLost с параметром RetryMode = rmRaise, начинает выстреливать исключения в бесконечном цикле?
Re: Разрыв соединения
К сожалению, нам не удалось воспроизвести проблему. Для исследования проблемы, пожалуйста, составьте и вышлите на viktorv*devart*com небольшой пример демонстрирующий проблему, включающий скрипты для создания объектов БД.