Как установить опцию автоподключения с MySQL соединителем C ++ - PullRequest
6 голосов
/ 02 февраля 2011

Привет, как я могу установить параметр autoReconnect с MySQL коннектором C ++?(не с mysql c api http://dev.mysql.com/doc/refman/5.0/en/mysql-options.html)

Ответы [ 3 ]

4 голосов
/ 03 февраля 2011

Я не являюсь пользователем этой библиотеки, поэтому я знаю, что это всего лишь последние 10 минут, поэтому, пожалуйста, подтвердите.

Как правило, лучший источник такой информации об использовании различных специфических деталей библиотеки - взглянуть на ее модульные тесты. Лучшая вещь об OSS.

Итак, если вы посмотрите на модульные тесты MySQL Connector / C ++, которые можно найти в их исходном дереве, вы увидите приведенный ниже фрагмент.

sql::ConnectOptionsMap connection_properties;

...

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

Для получения дополнительной информации, пожалуйста, сделайте следующее, чтобы вы могли посмотреть сами.

~/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 

Сказав все это, опцию повторного подключения в mysql нужно использовать очень осторожно, так как вам придется сбросить все переменные сеанса и т. Д. Вы должны будете рассматривать переподключенное соединение как новое соединение. Это должно быть подтверждено документацией конкретной версии MySQL, с которой вы работаете.

3 голосов
/ 10 августа 2015

Более полный пример

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;
}
3 голосов
/ 17 марта 2011

Вам необходимо передать логическое значение по ссылке. Мой код делает:


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

И это сработало для меня.

...