0xC0DEGURU
0xC0DEGURU

Reputation: 1792

libpqxx: How to reconnect to a Postgresql database after connection process has died

I instantiate a PostgreSQL connection through libpqxx. I query the database and get correct response. After that I tried the following error case: after instance of pqxx::connection has been created, I pause my program, manually kill the Postgre's connection process from a Linux's command shell and resume the program. It continues until it tries to create new transaction pqxx::work where it throws pqxx::broken_connection. I handle this exception and try to reconnect with a call to pqxx::connection::activate() but another pqxx::broken_connection gets thrown. How to reconnect to DB without instantiate another pqxx::connection?

P.S. reactivation is not inhibited. I use the standard connection type -

namespace pqxx
{  
    typedef basic_connection<connect_direct> connection;
}

Upvotes: 3

Views: 3219

Answers (1)

0xC0DEGURU
0xC0DEGURU

Reputation: 1792

Ok, nobody has answered. I noticed that after I manually kill the process behind the connection after several successive calls to pqxx::connection::activate, it gets reconnected, so that's my workaround.

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();
        }
    };
};

I call dbconnection::reconnect each time after I catch a pqxx::broken_connection. Let me know do you have better solution?

Upvotes: 1

Related Questions