我有一个稳定的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);
问题不是连接到服务器失败,而是连接没有“保持”,甚至没有持续几毫秒。
任何评论都值得赞赏。
答案 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;