我通过libpqxx实例化PostgreSQL连接。我查询数据库并获得正确的响应。之后,我尝试了以下错误情况:创建了pqxx::connection实例后,我暂停了程序,从Linux的命令 shell 中手动终止了Postgre的连接过程,然后继续执行该程序。它一直持续到尝试创建新事务pqxx::work并在其中抛出pqxx::broken_connection为止。我处理此异常,并尝试通过调用pqxx::connection::activate()重新连接,但另一个pqxx::broken_connection被抛出。如何在不实例化另一个pqxx::connection的情况下重新连接到DB?
附言重新激活不受抑制。我使用标准连接类型-
namespace pqxx
{
typedef basic_connection<connect_direct> connection;
}
最佳答案
好的,没有人回答。我注意到,在多次连续调用pqxx::connection::activate之后,我手动终止了连接背后的进程之后,它重新连接了,所以这就是我的解决方法。
class dbconnection : public pqxx::connection
{
public:
dbconnection(std::string options) : pqxx::connection(options) { };
void reconnect()
{
static int times = 0;
try
{
times++;
if(!this->is_open())
{
this->activate();
}
times = 0;
}
catch(const pqxx::broken_connection & e)
{
if(times > 10)
{
times = 0;
return;
}
this->reconnect();
}
};
};
每当我抓到pqxx::broken_connection后,我都会调用dbconnection::reconnect。让我知道您有更好的解决方案吗?