Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set autoreconnect option with mysql connector c++

Greetings, how can i set autoReconnect option with mysql connector c++ ? ( not with mysql c api http://dev.mysql.com/doc/refman/5.0/en/mysql-options.html )

like image 679
xdebug Avatar asked Feb 02 '11 20:02

xdebug


2 Answers

I am not a user of this library, so my knowledge of it is only that last 10 mins worth, so please do verify.

As a general rule, the best resource of such information about usage of various specific details of a library is to take a look at its unit tests. The best thing about OSS.

So if you look at MySQL Connector/C++ unit tests that can be found on their source tree, you will see the below extract.

sql::ConnectOptionsMap connection_properties;

...

connection_properties["OPT_RECONNECT"]=true;
try
{
    con.reset(driver->connect(connection_properties));
}
catch (sql::SQLException &e)
{
    std::cerr << e.what();
}

For more information, please do the below, so that you can take a look yourselves.

~/tmp$ bzr branch lp:~mysql/mysql-connector-cpp/trunk mysql-connector-cpp
~/tmp$ vi mysql-connector-cpp/test/unit/classes/connection.cpp +170
~/tmp$ vi mysql-connector-cpp/test/unit/classes/connection.h 

Having said all that, reconnect option in mysql has to be used very carefully, as you will have to reset any session variables, etc. You will have to treat a reconnected connection as a brand new connection. This has to be verified with the documentation of the particular version of MySQL you are working with.

like image 64
ϹοδεMεδιϲ Avatar answered Sep 22 '22 00:09

ϹοδεMεδιϲ


A more complete example

header

#include <boost/thread.hpp>
#include <boost/shared_ptr.hpp>

#include <mysql_connection.h>
#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
#include <cppconn/prepared_statement.h>

std::string host_name = "localhost";
std::string user_name = "user1234";
std::string password = "pw1234";
std::string database_name = "TestingDB";
bool reconnect_state = true;    

sql::ConnectOptionsMap connection_properties;
sql::Driver *driver;
boost::shared_ptr <sql::Connection> con;
boost::shared_ptr <sql::Statement> stmt;
boost::shared_ptr <sql::ResultSet> res;
boost::shared_ptr <sql::PreparedStatement> pstmt;

connect

driver = get_driver_instance ();    // protected    

con.reset(driver->connect (host_name, user_name, password));    // connect to mysql
con->setClientOption("OPT_RECONNECT", &reconnect_state);    
con->setSchema(database_name);

thread

std::vector <std::string> database::string_from_sql (std::string query, std::string column_name)
{        
    std::cout << __FILE__ << "(" << __FUNCTION__ << ":" << __LINE__ << ") | started" << std::endl;  

    std::vector <std::string> svec;

    try 
    {
        driver->threadInit();    // prevents multiple open connections
        if (con.get() == NULL)
        {
            std::cerr << __FILE__ << "(" << __FUNCTION__ << ":" << __LINE__ << ") | connection is not open" << std::endl;
            throw -2;            
        }
        stmt.reset (con->createStatement ());    
        res.reset (stmt->executeQuery (query));

        while (res->next()) 
        {
            svec.push_back(res->getString (column_name));
        }

        driver->threadEnd();
    }
    catch (sql::SQLException &e) 
    {
        std::cerr << __FILE__ << "(" << __FUNCTION__ << ":" << __LINE__ << ") | e.what(): " << e.what() << " (MySQL error code: " << e.getErrorCode() << ", SQLState: " << e.getSQLState() << " )" << std::endl;
        throw -1;
    }    

    if (svec.empty())
    {
        std::cerr << __FILE__ << "(" << __FUNCTION__ << ":" << __LINE__ << ") | return vector size is 0 (Empty set)" << std::endl;
        throw -3;            
    }

    std::cout << __FILE__ << "(" << __FUNCTION__ << ":" << __LINE__ << ") | ended" << std::endl;        

    return svec;
}
like image 34
xinthose Avatar answered Sep 22 '22 00:09

xinthose