PostgreSQL PQstatus 始终返回 CONNECTION_OK

标签 postgresql libpq

我正在尝试使用 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/

相关文章:

macos - Postgres 数据库没有角色

c++ - 打开PostgreSQL数据库连接的效率

sql - 有没有更好的方法来构建我的表,进行 4 表连接,或者我是否必须执行多个查询?

ruby-on-rails - NoMethodError(#<Profile :0x000000016d1fb8>) in production mode but not in development mode 的未定义方法 `search='

postgresql 错误 PANIC : could not locate a valid checkpoint record

c++ - 未定义对 PQfinish 的引用,即使包含库等

database - 如何解决Postgresql SCRAM身份验证问题?

c - 使用 libpq 在表中插入 float

sql - PostgreSQL 的 libpq 和 SELECT FROM

mysql - postgresql 插入一个 null 转换为默认值?