FireDAC "не удалось выполнить сетевой запрос к хосту" - PullRequest
0 голосов
/ 27 июня 2018

Полный текст ошибки: Удаленная ошибка: [FireDAC] [Phys] [FB] Невозможно выполнить сетевой запрос к хосту «dataserver16». Ошибка записи данных в соединение . Теперь кажется, что у других была эта проблема тогда, как только они сортировали это, это ушло, но у меня есть проблема спорадически.

My Datasnap ISAPI.dll, который содержит соединение FireDAC Firebird, работает на сервере IIS на компьютере, отличном от того, на котором размещена база данных (dataserver16), но в той же подсети. Я знаю, что все настроено правильно, потому что приложение работает с ожиданиями около 70% времени ! Остальные 30% времени мой клиент Datasnap получает эту ошибку (как передано обратно из DLL).

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Для полноты, я публикую свое решение здесь. Возможно, другие получат пользу от этого ответа. Решение состоит в том, чтобы выполнить повторные попытки подключения Firebird. Как я это сделал, каждый обработчик события TSOQQuery BeforeOpen подключен к одному и тому же методу. Это значительно повысило надежность (даже если немного замедлило). Код для FireDAC похож. И DBX, и FireDac работают одинаково хорошо здесь.

const
   retrycount = 3;

procedure TServerMethodsDBX.QueryBeforeOpen(DataSet: TDataSet);
begin
  TryConnect(TSQLQuery(DataSet).SQLConnection);
  // ...
end;

procedure TServerMethodsDBX.TryConnect(SQLConn: TSQLConnection);
var
  i: Integer;
  Error: String;
begin
  i := 0;
  SQLConn.Close;
  while (not SQLConn.Connected) and (i < retrycount) do
  begin
    try
      SQLConn.Connected := True
    except
    on e: exception do
    begin
      Error := Error + ' ' + e.Message;
      Sleep(500);
      Inc(i);
    end;
    end;
  end;
  if i = retrycount then
    LogMessage('Tryconnect error: ' + Error);
end;
0 голосов
/ 28 июня 2018

ИМХО похоже, что есть проблема с сетью. Если соединение установлено, и вы можете читать и записывать данные в это соединение, оно кажется правильным.

Вы пытались выполнить Ping из вашей исходной системы в целевую и зарегистрировать этот Ping, чтобы увидеть, исчезает ли дыра в соединении с сервером?

Откройте Commandwindow от имени администратора и введите:

Ping {TARGET} -t >> c:\ping.log

Затем дождитесь появления сообщения об ошибке и проверьте файл журнала, если ваша цель была доступна. Время дыры.

Для получения дополнительной справки нам нужна дополнительная справочная информация, например, версия Firebird или, если вы можете воспроизвести код ошибки + исходный код, как вы настроили ваше соединение.

...