当网络不稳定时,我该如何保持数据库连接不中断?

5
我们有一个应用程序,它使用BDE连接到Oracle数据库。
我使用TQuery进行SQL查询,并连接到TDatabase,我们不是专业的程序员,不知道在幕后发生了什么。
我们的网络不稳定,存在数据包丢失的问题。
当出现问题时,我们的应用程序会从数据库服务器断开连接,或者无法完成当前查询。
如何处理这个问题?
我们的网络团队正在努力解决根本问题,我们已经更改了代码,在遇到故障时重新连接到数据库。我们在数据库服务器上遇到了打开会话数过多的问题。
是否有任何解决方案?
这似乎是我们经常遇到的问题。
5个回答

5
我对数据库组件有以下建议:
  1. 在每个sql语句执行前连接数据库,在完成后关闭连接。
  2. 使用连接超时并在超时时重新启动查询。
  3. 如果数据库断开连接,则将数据暂存到客户端的本地数据库,并在重新连接后再次传输到中央数据库。这样可以避免数据丢失。
  4. 使用计时器检查中央数据库连接情况,以便将未传输的数据暂存。
这个问题在车间数据收集中很常见,上述建议是我能有效处理该问题的唯一方法。

4
尝试实现一个“看门狗”线程,它可以:
  1. 每X秒钟向网络(数据库服务器的IP地址)发送ping包
  2. 如果不可用,则禁用UI并尝试重新连接
请注意,任何事务都可能完全失败,请将该信息保存在某个地方。然后,在通过“看门狗”线程连接时,如果事务的性质允许,则再次尝试执行该事务。

3

采用n层架构可能会有所帮助...尤其是如果中间层也在数据库服务器上,那么它的连接就是本地的。最近Delphi的大多数实现都使用自定义HTTP服务器作为中间层,这样的好处是连接仅在执行当前请求时需要...一旦请求完成,连接就可以断开而不会出现任何问题。


1

使用DBExpress技术代替ADO或其他任何技术。dbquery + provider + Clientdataset的结构是“断开连接”的设计。

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

顺便说一下,使用DBExpress很容易将应用程序升级为n层架构。


1

很抱歉给您的答复比较简短...请修复您的网络。这是目前对您最好的选择。


1
有时候进行调试是很困难的,特别是对于硬件而言。我们都知道TCP/IP不稳定,互联网也不稳定,但我们需要在其上构建稳定的系统。 - linjunhalida
1
@JD,有时你会通过WAN或其他不受你控制的网络进行通信。 - Mark Harrison
1
如果您需要在不可靠或无控制的网络连接上进行数据库连接,则修改应用程序的架构,使用另一种协议与数据库交互。经典示例是使用XML Web服务而不是尝试直接连接到数据库。根据我的经验,数据库连接非常啰嗦,不适合质量较差的网络。 - Jeff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接