2011-02-02 16 views
5

Saludos, ¿cómo puedo configurar la opción de autoReconexión con el conector mysql C++? (no con mysql c api http://dev.mysql.com/doc/refman/5.0/en/mysql-options.html)Cómo establecer la opción de autoreconexión con el conector mysql C++

+0

En la API C es una práctica común que si una consulta falla, haga ping en la base de datos y vuelva a intentar la consulta. – chrisaycock

+0

puedo volver a conectarme si la consulta falla (el servidor Mysql se ha ido, la conexión se ha perdido durante la consulta, etc.) pero quiero configurar autoReconnect como se menciona en http://dev.mysql.com/doc/refman/5.0/en/connector-j -reference-configuration-properties.html – xdebug

Respuesta

4

No soy un usuario de esta biblioteca, por lo que mi conocimiento de ella solo vale los últimos 10 minutos, así que por favor verifique.

Como regla general, el mejor recurso de dicha información sobre el uso de varios detalles específicos de una biblioteca es echar un vistazo a sus pruebas unitarias. Lo mejor de OSS.

Si mira las pruebas de unidades MySQL Connector/C++ que se pueden encontrar en su árbol de fuentes, verá el extracto a continuación.

sql::ConnectOptionsMap connection_properties; 

... 

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

Para obtener más información, haga lo siguiente, para que pueda echar un vistazo a sí mismos.

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

Habiendo dicho todo esto, vuelva a conectar la opción de MySQL tiene que ser utilizada con mucho cuidado, ya que tendrá que restablecer las variables de sesión, etc Usted tendrá que tratar a una conexión a conectar como una nueva conexión de marca. Esto debe verificarse con la documentación de la versión particular de MySQL con la que está trabajando.

+0

Gracias @CodeMedic, mi versión de la biblioteca no tiene el método con.reset, lo intentaré con la última versión. Y también probé con> setClientOption ("OPT_RECONNECT", "true") sin suerte :( – xdebug

3

Debe pasar el valor booleano por referencia. Mi código sí lo hace:


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

Y eso funcionó para mí.

+0

parece que funcionó para mí también :) thx –

+1

[Referencia de la versión 5.6] (http: //dev.mysql. com/doc/refman/5.6/es/mysql-options.html) dice que debería ser 'MYSQL_OPT_RECONNECT' en su lugar. ¿Estás seguro? – gerrytan

+0

Intenté esto en la versión 5.6 y no funcionó – gerrytan

3

Una más completa ejemplo

cabecera

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

conectar

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

hilo

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