2

我正在尝试使用 PQstatus 检查与 PostgreSQL 服务器的连接状态,即使拔下连接到服务器的电缆,它也总是返回 CONNECTION_OK。

4

1 回答 1

4

假设您的问题是“为什么会发生”,而答案“这是预期的行为”是不够的。

的文档PQstatus不承诺测试连接,例如通过向服务器发送任何内容并等待答案。它只返回客户端库已知的连接状态。如果 (1) 连接发生问题,(2) 客户端库有机会注意到它,则此状态可能会发生变化。

SELECT 1如果您想注意何时拔下电缆,请定期向服务器发送类似的内容。UPD:还有一个pg_ping函数libpq,它可以做同样的事情,而不需要毫无意义的查询。

即使对于底层 TCP 层,拔下电缆通常也不会中断连接。系统永远不知道它是否会被重新插入,所以这是不明智的。有一个SO_KEEPALIVE选项,但它通常不会太早考虑连接“中断”(例如,Linux 上的默认设置是在3 小时不活动后发送 keepalive 探测)。

而且即使连接断开,libpq实际上也应该尝试读取或写入套接字以将其检测为错误。这不会发生,直到您以某种方式实现它 - 例如通过执行上面建议的查询。

于 2013-01-12T15:34:58.327 回答