我有工作线程,它永远运行,连接到postgresql数据库(使用libpqxx在c ++中)
#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服务器(工作线程仍在运行且未重新启动)我应该在尝试执行新查询时检查它是否仍然有效并且如果没有重新连接。 如何知道它是否还活着?
答案 0 :(得分:3)
如何在几小时后检查连接是否仍处于活动状态
唐&#39;吨
只要使用它,就好像它还活着一样。如果由于出现错误而抛出异常,请捕获异常并重试失败的事务。
尝试&#34;测试&#34;连接或&#34;验证&#34;他们注定要失败。存在固有的竞争条件,其中连接可能在验证和实际使用之间消失。所以你必须正确处理异常 - 在这一点上,首先没有必要进行连接验证。
查询可能会失败,并且出于多种原因可以中止事务。因此,您的应用必须始终在重试循环中执行事务,以检测可能的瞬态故障情况。这只是一种可能性 - 您可以通过管理员取消查询,死锁检测器中止事务,序列化失败取消事务等等。
为了避免不必要的低级TCP超时,您可以在连接,服务器端或客户端设置TCP keepalive。
如果你真的坚持这样做,知道它错了,只需发出一个空查询,即""
。