4

我们有一个使用 BDE 连接到 Oracle DB 的应用程序。
我使用 TQuery 进行 SQL 查询,它连接到 TDatabase,我们不是专业程序员,我们不知道幕后发生了什么。

我们的网络不稳定,我们遇到了丢包问题。

当问题发生时,我们的应用程序与数据库服务器断开连接,或者无法完成当前查询。
处理这个问题的最佳方法是什么?

我们的网络团队目前正在努力解决根本问题,我们已经更改了代码以在出现故障时重新连接到数据库。我们遇到了数据库服务器上打开会话数的问题。

有什么解决办法吗?
对我们来说,这似乎是一个普遍的问题。

4

5 回答 5

4

我在数据库组件上建议以下内容。

  1. 在每个 sql 上连接并在完成时关闭。
  2. 如果有超时,使用连接超时和重新启动查询
  3. 如果数据库断开连接,则将数据假脱机到客户端上的本地数据库,并在再次连接后重新开始传输到中央数据库。这样您就不会丢失任何数据。
  4. 使用计时器检查中央数据库连接以对未传输的数据进行假脱机。

这个问题在车间数据收集中很常见,上面的建议是我可以有效处理这个问题的唯一方法。

于 2009-05-20T11:08:10.500 回答
2

对不起,简短的回答...修复您的网络。在这一点上,这确实是您的最佳选择。

于 2009-05-20T00:36:42.527 回答
2

尝试实现一个“看门狗”线程:

  1. 每 X 秒 ping 一次网络(数据库服务器的 IP 地址)
  2. 如果不可用,则禁用 UI 并尝试再次连接

考虑到任何交易可能根本不会成功,并将该信息保存在某处。然后,在通过“看门狗”线程连接时,如果事务的性质允许,尝试再次执行该事务。

于 2009-05-20T15:31:10.563 回答
2

使用 n 层解决方案也可能会有所帮助……特别是如果中间层也在数据库服务器上,因此它的连接是本地的。Delphi 最近的大多数实现都使用自定义 HTTP 服务器作为中间层,这样做的好处是只有当前正在执行的请求才需要连接。一旦请求完成,可以毫无问题地切断连接.

于 2009-05-20T21:58:05.087 回答
1

使用 DBExpress 技术而不是其他任何东西的 ADO。dbquery + provider + Clientdataset 结构在设计上是“断开的”。

您可以简单地打开数据集、断开连接、重新连接并发布数据进行测试。

顺便说一句,使用 DBExpress 很容易将应用程序升级到 n 层方案。

于 2009-07-13T20:56:29.597 回答