powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Reconnect FireDAC + Oracle
14 сообщений из 14, страница 1 из 1
Reconnect FireDAC + Oracle
    #39633830
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день. Решил написать небольшое приложение под 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
Reconnect FireDAC + Oracle
    #39633867
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
20.04.2018 16:03, cptngrb пишет:
> В документации я читал, что можно проверять соединение c помощью *Ping*

это в какой?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Reconnect FireDAC + Oracle
    #39633879
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Reconnect FireDAC + Oracle
    #39633900
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Reconnect FireDAC + Oracle
    #39634481
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл сказать, что Oracle )
...
Рейтинг: 0 / 0
Reconnect FireDAC + Oracle
    #39635125
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb, ощущение что пытаешься построить свой велосипед при том что он там уже встроен. попутно к сведению, обработку ошибок, включая в частности потерю (и восстановление) соединения там можно делать централизованно а не оборачивая каждый запрос отдельно
...
Рейтинг: 0 / 0
Reconnect FireDAC + Oracle
    #39635289
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
За except end руки уже оторвали ?
...
Рейтинг: 0 / 0
Reconnect FireDAC + Oracle
    #39635465
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavan, это как?
...
Рейтинг: 0 / 0
Reconnect FireDAC + Oracle
    #39635467
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schi, можно было бы писать в лог, но пока не хочу
...
Рейтинг: 0 / 0
Reconnect FireDAC + Oracle
    #39635827
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbэто как?что именно "как"?
...
Рейтинг: 0 / 0
Reconnect FireDAC + Oracle
    #39635917
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavan, автортам можно делать централизованно а не оборачивая каждый запрос отдельно
...
Рейтинг: 0 / 0
Reconnect FireDAC + Oracle
    #39635934
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb, у многих компонент в anydac есть OnError, а у некоторых еще и OnRecover если уж встроенный функционал по восстановлению соединения и повторному выполнению не вполне устраивает. он конечно тоже с ошибками но возможно в свежих версиях получше работает, у меня увы заброшенная без права на апгрейд
...
Рейтинг: 0 / 0
Reconnect FireDAC + Oracle
    #39697011
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Reconnect FireDAC + Oracle
    #39699155
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, нормально работает при любых параметрах в Windows, а в Linux чтобы получить хоть какой-нибудь ответ после восстановления соединения я у коннекции выставляю:

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



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


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