我正在尝试使用 PQstatus 检查 PostgreSQL 服务器的连接状态,即使拔掉服务器的电缆,它也始终返回 CONNECTION_OK。
最佳答案
假设您的问题是“为什么会发生”,而答案“这是预期的行为”是不够的。
PQstatus
的文档不 promise 测试连接,例如通过向服务器发送任何内容并等待答案。它只是返回客户端库已知的连接状态。如果 (1) 连接发生问题,(2) 客户端库有机会注意到它,则此状态可能会更改。
如果您想注意到电缆何时被拔出,请定期向服务器发送诸如 SELECT 1
之类的内容。 UPD:libpq
中还有一个 pg_ping
函数,它可以执行相同的操作,而不需要无意义的查询。
即使对于底层 TCP 层,拔掉电缆通常也不会中断连接。 系统永远不知道它是否会被重新插入,所以这是不明智的。有一个 SO_KEEPALIVE
选项,但它通常不会过早地认为连接“断开”(例如,Linux 上的默认设置是在3 小时不活动后发送 keepalive 探测) .
即使连接中断,libpq
实际上应该尝试读取或写入套接字以将其检测为错误。除非你以某种方式让它发生,否则这不会发生——例如按照上面的建议执行查询。
关于PostgreSQL PQstatus 始终返回 CONNECTION_OK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14294696/