完整的错误文本为远程错误:[FireDAC] [Phys] [FB]无法完成对主机“ dataserver16”的网络请求。将数据写入连接时出错。现在看来,其他人遇到了这个问题,然后他们对它进行了整理,就消失了,但是我偶尔会遇到这个问题。
包含FireDAC Firebird连接的My Datasnap ISAPI.dll在与托管数据库(dataserver16)所在但位于同一子网上的另一台机器上的IIS服务器上运行。我知道所有配置都正确,因为 该应用程序可以在大约70%的时间内正常运行 !其他30%的时间,我的Datasnap客户端收到此错误(从dll传回)。
答案 0 :(得分:2)
恕我直言,看来是网络问题。如果建立了连接,并且您可以对此连接进行读写数据,则表明连接正确。
您是否尝试过从源系统到目标进行Ping并记录该Ping,以便可以查看与服务器的连接是否消失?
以管理员身份打开Commandwindow并输入:
Ping {TARGET} -t >> c:\ping.log
然后等到错误消失,然后检查日志文件(如果您的目标在“时间”可用)。
要获得更多帮助,我们需要更多背景信息,例如Firebird版本或如果您能够重现错误+源代码,则如何设置连接。
答案 1 :(得分:1)
为了完整起见,我在这里发布我的解决方案。也许其他人将从这个答案中受益。解决方案是执行Firebird连接的重试。我这样做的方法是,每个TSQLQuery的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;