【问题标题】:App losing db connection应用程序失去数据库连接
【发布时间】: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。

有人有什么可以尝试的建议吗?这让我发疯!

戴夫

【问题讨论】:

    标签: oracle delphi


    【解决方案1】:

    如果其他机器上的其他应用程序也确实失去了与数据库的连接,我会在数据库端进行调查并查看那里(提取性能统计信息、日志等)。
    也许 Perl 脚本导致数据库服务器上的一些资源阻塞,阻止其他尝试访问。
    它可能与 D6 应用程序的连接方式有关,让其他 C#、java... 能够工作?

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

    希望对你有帮助

    【讨论】:

    • 我的推理与你的一致。我让我们的 DBA 检查数据库端是否有任何看起来“错误”的东西,她说她没有发现任何记录的问题或数据库的任何问题。
    【解决方案2】:

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

    【讨论】:

    • 我确实要求 dba 检查日志,但不是专门用于重置侦听器。我会这样做,然后我会观察 PID,看看它是否会在下次问题发生时发生变化(可能是今天的某个时候......)。
    【解决方案3】:

    “地址00000000的访问冲突。读取地址00000000”具有非常具体的含义。这几乎可以肯定意味着某些东西试图在 nil 对象引用上调用虚拟方法。如果不是很明显,请尝试在调试 DCU 上重新构建并在调试器下运行。它应该会中断并准确显示问题出在哪里。

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

    【讨论】:

    • 我在使用调试器时强制出现问题的尝试失败了。该问题是间歇性的,但每周在服务器上发生几次。此外,D6 应用程序处理的数据集很小; perl 脚本正在处理的数据可能很大。
    【解决方案4】:

    戴夫, 我有同样的问题,但没有运行 perl 或其他进程。 我看到我的 oracle 数据库的 SGA_MAX_SIZE 低于必要值,但我现在无法关闭,因为是生产数据库并且非常用户有这个警告。

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

    祝你好运。 阿利森

    Ps:对不起我的英语不好

    【讨论】:

    • 感谢您的想法,但我遇到了与您相同的问题:这是一个生产数据库。通过用 C# 重写几个 Perl 脚本和一个 Delphi 应用程序,我们已经(大部分)解决了这个问题。
    【解决方案5】:

    DOA v 4.0.7.1 已有 5 年历史。为什么不尝试将您的 DOA 升级到最新版本?

    【讨论】:

    • 由于 Allround Automations 有一个 30 天的试用版,我可能会抓住它,看看它是否有所作为。不过我对此表示怀疑,因为该应用程序可以正常工作,直到/除非那些 perl 脚本正在处理大量数据。
    • 糟糕,刚刚意识到试用版只能在 IDE 中运行,这对我没有任何帮助。
    猜你喜欢
    • 2012-08-18
    • 2018-01-28
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 2011-12-04
    • 1970-01-01
    相关资源
    最近更新 更多