【问题标题】:Firebird 1.5.6 + Delphi 7 network connectivityFirebird 1.5.6 + Delphi 7 网络连接
【发布时间】:2011-11-10 14:07:55
【问题描述】:

当数据库放置在本地网络的远程机器上时,是否有人在使用 Delphi 7 应用程序和 Firebird 1.5.6 时遇到问题?

客户端和服务器计算机正在运行 Windows 7 操作系统。它定期发生。客户端应用程序失去与服务器的连接。

我在应用程序启动时打开到服务器的连接。我不知道这里发生了什么。我的客户使用该应用程序,打开 Delphi 表单,填写一些数据并离开 20 分钟。当他返回时决定完成填写表格,然后想要保存内容。在保存按钮上,应用程序冻结。

我认为连接已丢失。为什么,如何?

连接丢失时是否有可能获得异常或事件? 是否可以在保存过程之前确定连接是否处于活动状态?

让连接一直打开是错误的,还是在每次请求之前打开连接并在此之后关闭更好? 如果是,则连接阶段需要一些时间,不会太多,但足以感知它。

解决方案可能是设置操作系统网络超时。 但是在哪里以及如何?

编辑:另一种情况 除了描述的情况之外,当应用程序启动时有时会发生这种情况,有时需要 1 或 2 分钟才能打开与远程 Firebird 数据库的连接。我将它设计为在应用程序启动时打开连接。在那段时间之后,一切正常。我的意思是应用程序不会崩溃,但会再次发生冻结问题。 为什么有时连接需要这么长时间,我不知道?

【问题讨论】:

  • wifi 连接?执行测试网线
  • 除非 Cosmin 是正确的(您在启动时立即创建并启动了一个事务?)您将不得不进入您的代码或向您的代码添加一些日志记录并找出它在哪里冻结,然后也许,你也许能找出原因。单击保存可能会导致成千上万的事情发生。调试意味着找出哪一行代码(不是按钮点击)被冻结了。
  • 我有一个内部日志,但是当此时发生这种冻结时,日志记录失败。我试图登录一个文件,但什么也没有。问题发生在我对数据库做某事的时候。在每次数据库操作之前,我都会检查事务是否处于活动状态,如果没有,我会再次启动它。可能是唯一的方法是安装Delphi开发环境并进行调试,但这并不容易,因为它是我客户的计算机。
  • 该问题仅出现在网络环境中。这个故事的有趣部分是我无法在我的开发环境中重现这个问题。我整晚都在工作,没有任何问题。
  • 看起来很明显,但是您使用的是什么组件? IBX?另外,firebird.log 文件是什么样的?

标签: delphi network-programming firebird freeze


【解决方案1】:

您可以让TIbDatabase 保持连接状态,只要您愿意,它会在失去连接时自动重新连接。如果您处于联网状态,它在空闲时失去连接。

由于 Firebird 的多代架构,您不应该长时间保持TIbTransaction 处于活动状态:当您更改 Firebird 表中的某些内容时,会创建该“某事”的新记录,从而使所有旧记录保持活动状态因为至少有一个活跃的交易在徘徊。

我对正在发生的事情的猜测:您的 TIbTransaction 闲置了 20 分钟,TIbDatabase 连接断开,使您的 Transaction 进入未知状态。

【讨论】:

  • 我会检查您的建议,但我不明白为什么只有当我的客户端应用程序在 Windows 7 上运行时才会发生这种情况。这个问题从年初开始困扰我。我有很多事务,我在每个 SQL 操作之前检查它们。类似if not query1.Transaction.InTransaction then query1.Transaction.Commit;
  • 假设您是对的,但我不明白为什么当我创建一个 Timer 并开始每 10 秒检索少量记录时,数据库连接以及相关事务变得不活动。我这样做只是为了保持联系。问题依然存在。
  • 尝试@rstrelba 的更改 DummyPacketInterval 的建议,以首先确保问题确实与网络连接丢失有关。在没有任何流量的情况下,您与 Firebird 服务器的 TCP 会话将简单地过期,并且它们将以不可预知的方式过期。服务器本身可能“超时”,沿途的任何路由器都可能超时,甚至在 Windows 7 机器上运行的防火墙也可能会使 TCP 连接超时。服务器和客户端都可能认为 TCP 会话仍然处于活动状态,但沿途的一个防火墙可能会丢弃流量。
  • 一旦你弄清楚你的连接超时的原因,你可能应该这样做,这样事务就不会保持打开太久,这变成了一个非问题。我不会认为对 firebird.conf 的编辑是一个解决方案:我更喜欢我的 Firebird 应用程序在现有的 Firebird 配置上运行:使部署和管理更容易。
  • 我同意你的看法,但是我将如何以必须长时间打开的形式关闭交易。如果我关闭它,所有数据库组件都将丢失其内容。我希望解决方案很简单。
【解决方案2】:

尝试编辑 firebird.conf 文件

1) 找到参数DummyPacketInterval,去掉“#”改成DummyPacketInterval = 60
2)重启火鸟

【讨论】:

    【解决方案3】:

    检查客户端网络适配器驱动程序上的电源管理选项。 在设备管理器下,默认为关闭设备以节省电量

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多