Разрыв соединения

Обсуждение возникших проблем, предложений и ошибок MyDAC компонентов
Закрыто
toddams
Сообщения: 5
Зарегистрирован: Ср 23 окт 2013 21:10

Разрыв соединения

Сообщение toddams » Вт 29 окт 2013 17:33

Не совсем ясно как происходит восстановление соединения при разрыве оного. Компонент самостоятельно пытается наладить соединение, или нужно пользоваться специальными методами?
Второй вопрос на счёт события OnConnectionLost. Оно вызывается постоянно, пока соединение не восстановится, тоесть если хочется сообщить пользователю о разрыве соединения сообщением в showmessage, то окошко будет вызываться бесконечное количество раз, пока не произойдёт подключение к базе. Можете дать несколько советов как реализовать информатирование пользователя о проблемах с подключением? Третье, это то, что программа просто зависает если подключения нету, а пользователь пытается сделать выборку данных, а если подключение восстанавливается - программа "развисает", как решить даную проблему? Спасибо заранее

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: Разрыв соединения

Сообщение AndreyZ » Ср 30 окт 2013 13:55

Восстановление соединения происходит только если выполнены следующие условия:
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;
В данном случае, MyDAC произведет две попытки восстановить соединение и в случае неудачи сгенерирует исключение. Вы можете перехватывать данное исключение и выводить соответствующее сообщение пользователю.

toddams
Сообщения: 5
Зарегистрирован: Ср 23 окт 2013 21:10

Re: Разрыв соединения

Сообщение toddams » Ср 30 окт 2013 14:40

Спасибо за ответ. А можно в отдельном потоке пинговать сервер каждые 5-10 секунд и пробывать опять восстановить соединение в фоне?

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: Разрыв соединения

Сообщение AndreyZ » Ср 30 окт 2013 15:07

Можно.

A3AT
Сообщения: 2
Зарегистрирован: Ср 08 апр 2015 07:47

Re: Разрыв соединения

Сообщение A3AT » Ср 08 апр 2015 08:37

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
что ни есть удобно. Можете посоветовать, что-нибудь кошерное?

ViktorV
Devart Team
Сообщения: 212
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Разрыв соединения

Сообщение ViktorV » Ср 08 апр 2015 11:21

После установке переменной RetryMode в rmRaise в обработчике события OnConnectionLost, при разрыве соединения генерируется исключение, соединение закрывается и событие OnConnectionLost не будет возникать пока вы вручную не попытаетесь соединиться с сервером. При установке TMyConnection.Options.LocalFailover := False событие OnConnectionLost не возникает.

A3AT
Сообщения: 2
Зарегистрирован: Ср 08 апр 2015 07:47

Re: Разрыв соединения

Сообщение A3AT » Ср 08 апр 2015 13:33

ViktorV писал(а):После установке переменной RetryMode в rmRaise в обработчике события OnConnectionLost, при разрыве соединения генерируется исключение, соединение закрывается и событие OnConnectionLost не будет возникать пока вы вручную не попытаетесь соединиться с сервером. При установке TMyConnection.Options.LocalFailover := False событие OnConnectionLost не возникает.
я в курсе этого.
но вопрос был следующий:
почему после выхода из OnConnectionLost с параметром RetryMode = rmRaise, начинает выстреливать исключения в бесконечном цикле?

ViktorV
Devart Team
Сообщения: 212
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Разрыв соединения

Сообщение ViktorV » Ср 08 апр 2015 14:15

К сожалению, нам не удалось воспроизвести проблему. Для исследования проблемы, пожалуйста, составьте и вышлите на viktorv*devart*com небольшой пример демонстрирующий проблему, включающий скрипты для создания объектов БД.

Закрыто