2011-02-02 14 views
5

Selamlar, mysql bağlayıcısı C++ ile otomatik yeniden bağlanma seçeneğini nasıl ayarlayabilirim? (mysql c api ile değil http://dev.mysql.com/doc/refman/5.0/en/mysql-options.html)mysql bağlayıcısı ile autoreconnect seçeneği nasıl ayarlanır C++

+0

C API'sinde, bir sorgu başarısız olursa, veritabanına ping atmak ve sorguyu yeniden denemek yaygın bir uygulamadır. – chrisaycock

+0

Sorgulama başarısız olursa yeniden bağlayabilirim (Mysql sunucusu kayboldu, Bağlantı sırasında bağlantı kesildi vb) ancak http://dev.mysql.com/doc/refman/5.0/en/connector-j adresinde belirtildiği gibi autoReconnect'i ayarlamak istiyorum -reference-configuration-properties.html – xdebug

cevap

4

Bu kütüphanenin bir kullanıcısı değilim, bu yüzden bu konudaki bilgim sadece son 10 dakikadır, yani lütfen doğrulayın.

Genel bir kural olarak, bir kütüphanenin çeşitli ayrıntılarının kullanımıyla ilgili bu tür bilgilerin en iyi kaynağı ünite testlerine bakmaktır. OSS hakkında en iyi şey.

Kaynak ağacında bulunan MySQL Connector/C++ birim testlerine bakarsanız, aşağıdaki özü göreceksiniz.

sql::ConnectOptionsMap connection_properties; 

... 

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

Daha fazla bilgi için, lütfen aşağıdan bakın, böylece kendinize bir göz atabilirsiniz.

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

, vb yepyeni bağlantısı olarak bir yeniden bağlantı tedavisi için mysql seçenek, herhangi bir oturum değişkenleri sıfırlamak zorunda olacak gibi çok dikkatli kullanılmalıdır olacak yeniden bağlamak tüm bu having. Bu, üzerinde çalıştığınız MySQL'in belirli sürümünün belgelendirilmesiyle doğrulanmalıdır.

+0

Teşekkür ederim @CodeMedic, benim kütüphanem sürümü con.reset yöntemi yok, ben en son sürümü ile deneyeceğim. Ve ayrıca hiçbir şans olmadan con-> setClientOption ("OPT_RECONNECT", "true") denedim :( – xdebug

3

Boolean değerini başvuruyla iletmeniz gerekir. Benim kodum:


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

Ve bu benim için çalıştı.

+0

benim için de çalışmış gibi görünüyor :) thx –

+1

[Sürüm 5.6 referans] (http: //dev.mysql. com/doc/refman/5.6/tr/mysql-options.html) bunun yerine "MYSQL_OPT_RECONNECT" olması gerektiğini söylüyor. Emin misiniz? – gerrytan

+0

Bunu 5.6 sürümünde denedim ve çalışmadı – gerrytan

3

daha tam bir örnek

başlık

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

bağlamak

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

iplik

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