2011-02-02 27 views
5

Lời chào, làm thế nào tôi có thể đặt tùy chọn tự động kết nối với kết nối mysql C++? (không phải với mysql c api http://dev.mysql.com/doc/refman/5.0/en/mysql-options.html)Cách đặt tùy chọn tự động kết nối với đầu nối mysql C++

+0

Thực tiễn phổ biến trong API C là nếu truy vấn không thành công, hãy ping cơ sở dữ liệu và thử lại truy vấn. – chrisaycock

+0

tôi có thể kết nối lại nếu truy vấn thất bại (máy chủ Mysql đã biến mất, Mất kết nối trong khi truy vấn v.v.) nhưng tôi muốn đặt autoReconnect như được đề cập tại http://dev.mysql.com/doc/refman/5.0/en/connector-j -reference-configuration-properties.html – xdebug

Trả lời

4

Tôi không phải là người dùng thư viện này, vì vậy kiến ​​thức của tôi về nó chỉ có giá trị 10 phút cuối cùng, vì vậy vui lòng xác minh.

Theo nguyên tắc chung, tài nguyên tốt nhất của thông tin đó về việc sử dụng các chi tiết cụ thể khác nhau của thư viện là xem xét các bài kiểm tra đơn vị của nó. Điều tốt nhất về PMNM.

Vì vậy, nếu bạn xem xét các trình kiểm tra đơn vị kết nối MySQL/C++ có thể tìm thấy trên cây nguồn của chúng, bạn sẽ thấy phần trích xuất bên dưới.

sql::ConnectOptionsMap connection_properties; 

... 

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

Để biết thêm thông tin, vui lòng thực hiện bên dưới để bạn có thể tự xem.

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

Có nói tất cả những gì, kết nối lại tùy chọn trong mysql phải được sử dụng rất cẩn thận, vì bạn sẽ phải thiết lập lại bất kỳ biến phiên giao dịch, vv Bạn sẽ phải đối xử với một kết nối kết nối lại như một kết nối hoàn toàn mới. Điều này phải được xác minh bằng tài liệu về phiên bản MySQL cụ thể mà bạn đang làm việc.

+0

Cảm ơn bạn @CodeMedic, phiên bản thư viện của tôi không có phương thức con.reset, tôi sẽ dùng thử phiên bản mới nhất. Và tôi cũng đã thử con-> setClientOption ("OPT_RECONNECT", "true") không có may mắn: ( – xdebug

3

Bạn cần chuyển giá trị boolean theo tham chiếu. Mã của tôi có:


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

Và điều đó hiệu quả với tôi.

+0

có vẻ như nó cũng hoạt động với tôi :) thx –

+1

[Tham chiếu phiên bản 5.6] (http: //dev.mysql. com/doc/refman/5.6/en/mysql-options.html) nói rằng nó phải là 'MYSQL_OPT_RECONNECT' thay thế. Bạn có chắc không? – gerrytan

+0

Đã thử điều này trên phiên bản 5.6 và không hoạt động – gerrytan

3

Một hoàn chỉnh hơn ví dụ

tiêu đề

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

kết nối

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

chủ đề

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; 
} 
Các vấn đề liên quan