PostgreSQL PQstatus总是返回CONNECTION_OK

时间:2013-01-12 15:16:58

标签: postgresql libpq

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

1 个答案:

答案 0 :(得分:4)

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

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

如果要在拔下电缆时注意到,请定期向服务器发送SELECT 1之类的内容。 UPD:pg_ping中还有一个libpq函数,无需进行无意义查询即可完成相同的操作。

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

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