Oracle 应用程序失去数据库连接

Oracle 应用程序失去数据库连接,oracle,delphi,Oracle,Delphi,我遇到了一个奇怪的问题,一个旧的Delphi应用程序失去了它的数据库连接。事实上,我认为它正在丢失其他东西,从而导致连接中断或无法使用。该应用程序是用Delphi 6编写的,并使用直接Oracle Access组件(v4.0.7.1)连接到Oracle 9i数据库。该应用程序作为服务运行,并使用TOracleQuery对象(qryAlarmList)定期查询数据库。为此调用的方法如下所示: procedure TdmMain.RefreshAlarmList; begin try q

我遇到了一个奇怪的问题,一个旧的Delphi应用程序失去了它的数据库连接。事实上,我认为它正在丢失其他东西,从而导致连接中断或无法使用。该应用程序是用Delphi 6编写的,并使用直接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运行的同时突然失去与数据库对话的能力。这两个应用程序都不在此计算机上运行,但都是Delphi 6应用程序,它们使用相同的DOA组件连接到相同的数据库。我们有其他应用程序连接到同一个数据库,用Java或C编写,它们似乎没有任何问题

我已尝试在调用“.Execute”方法之前添加代码:

  • 检查会话的连接 (session.CheckConnection(true); 总是以“ccOK”的形式返回

  • 看看我是否可以访问 qryAlarmList对象,以查看 也许它变成了空的;我可以访问它 好的

  • 检查qryAlarmList的状态; 总是说它是空闲的

有人有什么可以尝试的建议吗?这简直快把我逼疯了


Dave

如果其他机器上的其他应用程序也失去了与DB的连接,我会在DB端进行调查并查看(拉出性能统计、日志等)。
可能是Perl脚本导致数据库服务器上的某些资源阻塞,阻止了其他试图访问的服务器。
这可能与D6应用程序的连接方式有关,而其他的C#,java。。。能工作吗

我的理由是,我只将DB视为MachineA/D6失去连接和MachineB/D6失去连接中的公共链接


希望有帮助

听起来好像有什么东西在重置侦听器。让dba检查各种日志,看看这些perl作业运行时侦听器是否反弹。或者检查侦听器的PID(进程ID)是否全天保持不变,或者在这些perl作业运行时是否会跳转。

“地址00000000处的访问冲突。读取地址00000000”有一个非常具体的含义。几乎可以肯定的是,有东西试图在nil对象引用上调用虚方法。如果不是很明显,请尝试在启用调试DCU的情况下重建,并在调试器下运行。它应该会中断,并向您显示问题的确切位置


另外,您提到您使用的是Delphi6,这只发生在大型数据集上。在这种情况下,您可能想看看FastMM4,一个替代内存管理器。旧的BorlandMM内存管理器存在一些问题,在处理大量数据时可能会导致访问冲突,FastMM解决了这些问题。

DOA v 4.0.7.1已经5年了。为什么不尝试将DOA升级到最新版本?

Dave, 我也有同样的问题,但没有运行perl或其他进程。 我看到我的oracle数据库的SGA_MAX_大小低于必需的大小,但我现在不能关闭,因为它是生产数据库,并且警告用户

请查看/更改您的数据库参数并给我们反馈

祝你好运。 阿利松


Ps:对不起,我的英语很差

我试图在使用调试器时强制出现问题,但失败了。该问题是间歇性的,但在服务器上每周发生几次。此外,D6应用程序处理的数据集很小;perl脚本所处理的数据可能很大,我的推理与你的一致。我让我们的DBA检查数据库端是否有任何看起来“错误”的内容,她说她没有发现任何记录的问题或db有任何问题。我确实让DBA检查了日志,但没有特别检查重置侦听器的内容。我会这样做,我会观察PID,看看它是否会在下次问题发生时改变(可能是今天的某个时候…)。因为Allround Automations有一个30天的试用版,我可能会抓住它,看看它是否有不同。不过我还是有点怀疑,因为除非那些perl脚本正在处理一堆数据,否则应用程序还是可以正常工作的。哎呀,我刚刚意识到,试用版只在IDE内部工作,这对我没有任何帮助。谢谢你的想法,但我遇到了和你一样的问题:它是一个生产数据库。我们通过在C#中重新编写两个Perl脚本和一个Delphi应用程序来解决这个问题(大部分情况下)。