Datasnap获取10054-套接字错误#10054对等重置连接。在TDBXCommand.Prepare中

时间:2019-08-23 09:17:20

标签: delphi tcp datasnap

我有一个稳定的Delphi 10.2.3 TCP / IP Datasnap服务器和客户端,可以在99.9%的时间内正常运行。有时,用户会收到“由对等方重置10054连接”错误。我使用Eurekalog,并且调用堆栈报告显示错误发生在生成的DBXCommand.Prepare的{​​{1}}语句中:

ClientClassesUnit

当然,到Datasnap服务器的连接是在调用服务器方法之前使用通常的方法完成的:

function TServerMethods3Client.UpdateTask(ID: Integer): Boolean;
begin
  if FUpdateTaskCommand = nil then
  begin
    FUpdateTaskCommand := FDBXConnection.CreateCommand;
    FUpdateTaskCommand.CommandType := TDBXCommandTypes.DSServerMethod;
    FUpdateTaskCommand.Text := 'TServerMethods3.UpdateTask';
    FUpdateTaskCommand.Prepare; // --> exception is raised here
  end;
  FUpdateTaskCommand.Parameters[0].Value.SetInt32(ID);

问题不是连接到服务器失败,而是连接没有“保持”,甚至没有持续几毫秒。

任何评论都值得赞赏。

1 个答案:

答案 0 :(得分:0)

由于我真的不想要,我最终还是这样做了:

function ClientModule1.UpdateTask: Boolean;
var
  i: integer
begin
  Result := False;
  i := 0;
  while (i < 3) and (not Result) do 
  begin
    if ServerConnect then
    begin
      Server := TServerMethods3Client.Create(SQLConnection1.DBXConnection);
      try
        try
          Result := Server.UpdateTask(CDSTask.FieldByName('ID').AsInteger);
        except
        on e: exception do
        begin
          inc(i)
          if i = 3 then
            MessageDlg(e.Message, mtError, [mbOk], 0);
          Sleep(1000);
        end
        end
      finally
        Server.Free;
        SQLConnection1.Connected := False;
      end;
    end;
  end;
end;

function ClientModule1.ServerConnect: Boolean;
var
  i: Integer;
begin
  if SQLConnection1.Connected then
    SQLConnection1.Close;
  i := 0;
  while (not SQLConnection1.Connected) and (i < 3) do
  begin
    try
      SQLConnection1.Open;
    except
    on e: exception do
    begin
      inc(i)
      if i = 3 then
        MessageDlg(e.Message, mtError, [mbOk], 0);
      sleep(1000);
    end;
    end;
  end;
end;