Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Reconnect FireDAC + Oracle / 14 сообщений из 14, страница 1 из 1
20.04.2018, 16:03
    #39633830
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reconnect FireDAC + Oracle
Добрый день. Решил написать небольшое приложение под Linux. Для выполнения запросов взял FireDAC. Запрос выполняется, все хорошо, пока с сетью проблем нет. Через раз при выполнении запроса вылетает ошибка, что соединение потеряно, следовательно нужно переподключаться. Делаю так

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
try
    FDQuery.ExecSQL; //если не вовремя, то возвращается ошибка
    FDQuery.Close;
except
   on E: EFDDBEngineException do begin
    if E.Kind = ekServerGone then
    EConnect:= True
    else  EOracle:= True;
    end;
    on E: EFDException do begin
     EFD:= True;
     end;
     on E: exception do begin
     EOther:= True;
     end;
end;



Если ошибка связи, то EConnect:= True

Далее, в цикле пытаюсь соединиться

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
function CheckConnection: boolean;
var
  Q: TFDQuery;
begin
  Result:= False;
  
  try
    if FDConnection.Connected then
    begin
      Q:= TFDQuery.Create(nil);
      Q.Connection:= FDConnection;
      try
        Q.SQL.Text := 'select 1 from dual';
        Q.Execute;
        Result:= True;
      except
        on E: exception do
        begin
          Result:= False;
          try
            FDConnection.Open;
            Result:= True;
          except
          end;
        end;
      end;
      Q.Free;
    end
    else
    begin
      FDConnection.Open;
      if FDConnection.Connected then
      Result:= True
      else Result:= False;
    end;
  except
    on E: exception do
    begin
      WriteErrorLog(e.Message);
    end;
  end;
end;



В документации я читал, что можно проверять соединение c помощью Ping , выставлять у коннекции автоподключение, но вроде бы, где-то читал ))), что это не дает 100% результата восстановления соединения. Как бы вы проверяли связь?
...
Рейтинг: 0 / 0
20.04.2018, 16:38
    #39633867
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reconnect FireDAC + Oracle
20.04.2018 16:03, cptngrb пишет:
> В документации я читал, что можно проверять соединение c помощью *Ping*

это в какой?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.04.2018, 16:51
    #39633879
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reconnect FireDAC + Oracle
...
Рейтинг: 0 / 0
20.04.2018, 17:13
    #39633900
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reconnect FireDAC + Oracle
cptngrb http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Recovering_Connection_(FireDAC) Known limitations:

DBMSDescriptionAdvantage DatabaseNot supported for a local free connection.dbExpress bridge driverFireDAC may fail to detect ekServerGone. Ping method is not supported.InformixRequired to set DirectExecute to True.Microsoft AccessNot supported.MySQLTo minimize call delays when the network connection is lost, consider adjusting the ReadTimeout and WriteTimeout connection definition parameters.ODBC bridge driverFireDAC may fail to detect ekServerGone. The Ping method is not supported.SQLiteNot supported.
...
Рейтинг: 0 / 0
23.04.2018, 08:16
    #39634481
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reconnect FireDAC + Oracle
забыл сказать, что Oracle )
...
Рейтинг: 0 / 0
24.04.2018, 08:45
    #39635125
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reconnect FireDAC + Oracle
cptngrb, ощущение что пытаешься построить свой велосипед при том что он там уже встроен. попутно к сведению, обработку ошибок, включая в частности потерю (и восстановление) соединения там можно делать централизованно а не оборачивая каждый запрос отдельно
...
Рейтинг: 0 / 0
24.04.2018, 12:48
    #39635289
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reconnect FireDAC + Oracle
За except end руки уже оторвали ?
...
Рейтинг: 0 / 0
24.04.2018, 15:07
    #39635465
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reconnect FireDAC + Oracle
vavan, это как?
...
Рейтинг: 0 / 0
24.04.2018, 15:09
    #39635467
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reconnect FireDAC + Oracle
schi, можно было бы писать в лог, но пока не хочу
...
Рейтинг: 0 / 0
25.04.2018, 09:41
    #39635827
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reconnect FireDAC + Oracle
cptngrbэто как?что именно "как"?
...
Рейтинг: 0 / 0
25.04.2018, 11:35
    #39635917
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reconnect FireDAC + Oracle
vavan, автортам можно делать централизованно а не оборачивая каждый запрос отдельно
...
Рейтинг: 0 / 0
25.04.2018, 11:50
    #39635934
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reconnect FireDAC + Oracle
cptngrb, у многих компонент в anydac есть OnError, а у некоторых еще и OnRecover если уж встроенный функционал по восстановлению соединения и повторному выполнению не вполне устраивает. он конечно тоже с ошибками но возможно в свежих версиях получше работает, у меня увы заброшенная без права на апгрейд
...
Рейтинг: 0 / 0
03.09.2018, 09:39
    #39697011
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reconnect FireDAC + Oracle
Linux. Oracle. х64. Консольное приложение.
Решил перейти на пул соединений. Для этого нужно создать пул

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
procedure CreateConnectionDef(const AName, AUser, APassword, AConnectStr: string; const APool: boolean; const ACountMax: integer);
var
  ConnectionDef: IFDStanConnectionDef;
begin

  ConnectionDef:=FDManager.ConnectionDefs.AddConnectionDef;
  ConnectionDef.Params.Clear;
  ConnectionDef.Name:= AName;
  ConnectionDef.Params.UserName:= AUser;
  ConnectionDef.Params.Password:= APassword;
  ConnectionDef.Params.Database:= AConnectStr;
  ConnectionDef.Params.DriverID:= 'Ora';

  if APool then begin
    FDManager.ConnectionDefs.ConnectionDefByName(AName).Params.Pooled := True;
    FDManager.ConnectionDefs.ConnectionDefByName(AName).Params.PoolMaximumItems := ACountMax;
  end;
end;



При запуске приложения

Код: pascal
1.
2.
3.
4.
5.
6.
7.
FDPhysOracleDriverLink1.NLSLang:= 'AMERICAN_AMERICA.CL8MSWIN1251';
FDPhysOracleDriverLink1.VendorLib:= '/opt/oracle/instantclient_12_2/libclntsh.so';
FDManager.Close;
while FDManager.State <> dmsInactive do
Sleep(0);
FDManager.Open;
CreateConnectionDef(DefaultConDefNamePool, user_name, passwd, con_str, True, MAX_SESSION_COUNT);



Далее, в отдельном потоке
В конструкторе:
Код: pascal
1.
2.
3.
4.
oConnection := TFDConnection.Create(nil);
oConnection.LoginPrompt:= False;
oConnection.ResourceOptions.SilentMode:= true;
oConnection.ResourceOptions.AutoReconnect:= true;



В Execute потока:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
function TDBPacket.Connect2Server(AConnection: TFDConnection): boolean;
begin
  try
  AConnection.ConnectionDefName:= DefaultConDefNamePool;
  AConnection.Connected:= True; //ушел в себя приду не скоро
  except
     логирование - но нет записи
  end;
end;



Как я проверяю потерю соединения: запускаю приложение, устанавливаю соединение и выполняю запросы пару раз, отключаю
сетевое соединение, дожидаюсь ошибки соединения, включаю сетевое соединение и на AConnection.Connected:= True; приложение уходит в себя.
Подскажите люди добрые WHF?
...
Рейтинг: 0 / 0
06.09.2018, 16:23
    #39699155
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Reconnect FireDAC + Oracle
В общем, нормально работает при любых параметрах в Windows, а в Linux чтобы получить хоть какой-нибудь ответ после восстановления соединения я у коннекции выставляю:

Код: pascal
1.
2.
AutoConnect:= False;
AutoReconnect:= False;



Ответ приходит хоть и не так быстро, но приходит.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Reconnect FireDAC + Oracle / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]