【发布时间】:2010-06-11 19:07:17
【问题描述】:
我遇到了一个奇怪的问题,一个旧的 Delphi 应用程序失去了它的数据库连接。实际上,我认为它正在丢失其他东西,然后使连接断开或无法使用。该应用程序是用 Delphi 6 编写的,并使用 Direct Oracle Access 组件 (v4.0.7.1) 连接到 Oracle 9i 数据库。该应用程序作为服务运行,并使用 TOracleQuery 对象 (qryAlarmList) 定期查询数据库。为此调用的方法如下所示:
procedure TdmMain.RefreshAlarmList;
begin
try
qryAlarmList.Execute;
except
on E: Exception do
begin
FStatus := ssError;
EventLog.LogError(-1, 'TdmMain.RefreshAlarmList', 'Message: ' + E.Message);
end;
end;
end;
它多年来一直运行良好,直到在这台机器上添加了几个 Perl 脚本。这些脚本每 15 分钟运行一次,并查找要导入数据库的数据文件,然后它们会进行一些计算和一堆对数据库的读/写操作。出于某种原因,当他们正在处理大量数据,然后 Delphi 应用程序尝试查询数据库时,Delphi 应用程序在上述代码清单中的“qryAlarmList.Execute”行抛出异常。例外总是:
Access violation at address 00000000. read of address 00000000
Perl 脚本正在做的事情怎么会导致这种情况?这台机器上还有其他 Perl 脚本使用相同的模块和方法调用加载数据,我们没有遇到问题。更奇怪的是,还有另外两个应用程序也会在 Perl 运行的同时突然失去与数据库通信的能力。这些应用程序都没有在这台机器上运行,但它们都是使用相同 DOA 组件连接到相同数据库的 Delphi 6 应用程序。我们有其他应用程序连接到同一个数据库,用 Java 或 C# 编写,它们似乎没有任何问题。
我尝试在调用 '.Execute' 方法之前添加代码:
检查会话的连接 (session.CheckConnection(true); 总是以 'ccOK' 的形式返回)。
查看我是否可以访问 qryAlarmList 对象查看是否 也许它变成了空;可以访问它 很好。
检查 qryAlarmList 的状态; 总是说是 qsIdle。
有人有什么可以尝试的建议吗?这让我发疯!
戴夫
【问题讨论】: