3

我有一个与优势数据库一起使用的 Windows 服务,并且偶尔会进行一些 http 调用。在极少数情况下,这些电话可能会很长。我的数据库连接超时。我没有使用数据模块或任何东西。只需手动创建连接。

我的主要问题是,如果我有一段时间没有使用它,通常什么会阻止连接超时?TAdsComponents 是否会发送一条在后台以某种方式调用的保持活动消息?这是否取决于 vcl,所以我的服务中没有它?不知何故,我想创建一个线程来进行我的 http 调用,并且在主线程中每隔几秒钟检查一次它是否完成会防止连接死亡。这是真的吗?

4

1 回答 1

6

是的,正如您所料,有一个保活机制。客户端(对于所有通信类型,TCP、UDP、共享内存)每隔一段时间向服务器发送一个“ping”,让服务器知道连接仍然存在。该保活 ping 的频率基于服务器配置参数 CLIENT_TIMEOUT。使用默认设置,我相信每 30 秒发送一次 keepalive ping。

keepalive 逻辑在一个单独的线程中运行,该线程由处理通信的代码启动。换句话说,它不依赖于任何 VCL 组件;如果您有与服务器的连接,那么该线程应该正在运行。

检查连接是否超时的一种方法是查看 Advantage 错误日志。应该有与超时连接对应的 7020 错误。

想到的一些可能导致连接超时的事情包括:

  • 客户端进程由于某种原因被挂起,导致 keepalive 线程无法运行。这似乎不太可能。
  • 由于某种原因,keepalive 线程被杀死。这似乎也不太可能;你必须竭尽全力才能做到这一点。
  • 如果一段时间内没有活动,防火墙可能会关闭连接。不过,我认为 30 秒的间隔足以防止这种情况发生。
  • 防火墙可能不允许 UDP keepalive 数据包。防火墙本质上对 UDP 数据包是“可疑的”。您可以确保您使用的是 TCP/IP。
于 2013-02-08T19:38:04.070 回答