2

我有一个工作线程,它永远运行,连接到 postgresql 数据库(在 c++ 中使用 libpqxx)

#include <pqxx/connection>

// later in code on starting thread only once executed
connection* conn= conn = new connection(createConnectionString(this->database, this->port, this->username, this->password));

如何在几个小时后检查连接是否仍处于活动状态,例如,如果我同时重新启动 postgre 服务器(工作线程仍在运行且未重新启动),当我尝试执行新查询时,我应该检查它是否仍然有效并重新连接如果它不是。如何知道它是否还活着?

4

1 回答 1

3

如何在几个小时后检查连接是否仍然有效

不。

只要使用它,就好像它还活着一样。如果由于出现问题而引发异常,则捕获异常并重试从头开始失败的事务。

尝试“测试”连接或“验证”它们注定要失败。存在一种固有的竞争条件,即验证和实际使用之间的连接可能会消失。所以无论如何你都必须正确处理异常——此时首先进行连接验证是没有意义的。

由于多种原因,查询可能会失败并且事务可能会中止。因此,您的应用程序必须始终在重试循环中执行事务,以检测可能的瞬时故障情况。这只是一种可能性——您还可能有一个查询被管理员取消,一个事务被死锁检测器中止,一个事务被序列化失败取消,等等。

为避免不必要的低级别 TCP 超时,您可以在连接、服务器端或客户端设置 TCP keepalive。

如果你真的坚持这样做,知道这是错误的,只需发出一个空查询,即"".

于 2014-07-24T01:26:42.720 回答