开发者

How to set autoreconnect option with mysql connector c++

开发者 https://www.devze.com 2023-02-08 08:59 出处:网络
Greetings, how can i set autoReconnect option withmysql connector c++ ? ( not with mysql c api http://dev.mysql.com/doc/refman/5.0/en/mysql-optio开发者_如何学Pythonns.html )I am not a user of this lib

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-optio开发者_如何学Pythonns.html )


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.


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


You need to pass the boolean value by reference. My code does:


bool myTrue = true;
con->setClientOption("OPT_RECONNECT", &myTrue);

And that worked for me.

0

精彩评论

暂无评论...
验证码 换一张
取 消