我有一个奇怪的问题,旧的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(真); 总是以“ccOK”的形式回归。
看看我是否可以访问某个字段 qryAlarmList对象,看看是否 也许它变成了无效;可以访问它 细
检查qryAlarmList的状态; 总是说它是qsIdle。
有没有人有任何尝试的建议?这让我疯了!
戴夫
答案 0 :(得分:1)
如果其他机器上的其他应用程序也丢失了与数据库的连接,我会调查数据库端并查看(删除性能统计,日志,......)。 也许Perl脚本导致数据库服务器上的某些资源堵塞,阻止其他尝试访问 它可能与D6应用程序的连接方式有关,而另一个C#,java ...能够工作吗?
我的理由是我只看到DB作为MachineA / D6丢失连接和MachineB / D6失去连接的公共链接......
希望有所帮助
答案 1 :(得分:1)
听起来有些东西正在重置听众。让dba检查各种日志,看看当这些perl作业运行时监听器是否会弹跳。或者检查监听器的PID(进程ID)是否整天保持不变,或者当这些perl作业运行时它是否跳转。
答案 2 :(得分:1)
“地址00000000处的访问冲突。读取地址00000000”具有非常特定的含义。它几乎肯定意味着某些东西试图在 nil 对象引用上调用虚方法。如果它不是显而易见的东西,那么尝试使用Debug DCU重建并在调试器下运行。它应该打破并告诉你问题的确切位置。
另外,你提到你在Delphi 6中,这只适用于大型数据集。在这种情况下,您可能希望查看替换内存管理器FastMM4。旧的BorlandMM内存管理器在处理大量数据时遇到了一些可能导致访问冲突的问题,FastMM修复了这些问题。
答案 3 :(得分:1)
戴夫 我有同样的问题,但没有运行perl或其他进程。 我看到我的oracle db在SGA_MAX_SIZE下面是必要的,但我现在无法关闭,因为是生产数据库并且非常警告用户。
请查看/更改您的数据库参数并向我们提供反馈
祝你好运。 AllissonPs:抱歉,我的英语不好
答案 4 :(得分:0)
DOA v 4.0.7.1已有5年历史。为什么不尝试将您的DOA升级到最新版本?