2011-02-02 12 views
5

ग्रीटिंग्स के साथ ऑटोरेकनेक्ट विकल्प कैसे सेट करें, मैं mysql कनेक्टर C++ के साथ autoReconnect विकल्प कैसे सेट कर सकता हूं? (mysql c api http://dev.mysql.com/doc/refman/5.0/en/mysql-options.html के साथ नहीं)mysql कनेक्टर C++

+0

सी एपीआई में यह सामान्य प्रथा है कि यदि कोई क्वेरी विफल हो जाती है, डेटाबेस को पिंग करने और फिर से क्वेरी को आज़माने के लिए। – chrisaycock

+0

यदि क्वेरी विफल हो जाती है तो मैं फिर से कनेक्ट कर सकता हूं (MySQL सर्वर चला गया है, क्वेरी आदि के दौरान कनेक्शन खो गया है) लेकिन मैं http://dev.mysql.com/doc/refman/5.0/en/connector-j पर उल्लिखित ऑटो रीकनेक्ट सेट करना चाहता हूं -reference-config-properties.html – xdebug

उत्तर

4

मैं इस पुस्तकालय का उपयोगकर्ता नहीं हूं, इसलिए मेरा ज्ञान केवल पिछले 10 मिनट के लायक है, इसलिए कृपया सत्यापित करें।

एक सामान्य नियम के रूप में, पुस्तकालय के विभिन्न विशिष्ट विवरणों के उपयोग के बारे में ऐसी जानकारी का सबसे अच्छा संसाधन अपने यूनिट परीक्षणों को देखने के लिए है। ओएसएस के बारे में सबसे अच्छी बात है।

तो यदि आप MySQL कनेक्टर/सी ++ यूनिट परीक्षणों को देखते हैं जो उनके स्रोत पेड़ पर पाए जा सकते हैं, तो आप नीचे निकालेंगे।

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 के विशेष संस्करण के दस्तावेज़ के साथ सत्यापित करना होगा जिसके साथ आप काम कर रहे हैं।

+0

धन्यवाद @CodeMedic, लाइब्रेरी के मेरे संस्करण में con.reset विधि नहीं है, मैं इसे नवीनतम संस्करण के साथ आज़माउंगा। और मैंने con-> setClientOption ("OPT_RECONNECT", "true") को कोई किस्मत के साथ भी कोशिश की :( – xdebug

3

आपको संदर्भ द्वारा बूलियन मान पास करने की आवश्यकता है। मेरा कोड करता है:


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

और यह मेरे लिए काम करता है।

+0

ऐसा लगता है कि यह मेरे लिए भी काम करता है :) thx –

+1

[संस्करण 5.6 संदर्भ] (http: //dev.mysql। com/doc/refman/5.6/en/mysql-options.html) कहता है कि यह इसके बजाय 'MYSQL_OPT_RECONNECT' होना चाहिए। क्या आपको यकीन है? – gerrytan

+0

ने संस्करण 5.6 पर इसका प्रयास किया और – gerrytan

3

एक और पूरी उदाहरण

हैडर

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

कनेक्ट

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

धागा

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; 
} 
संबंधित मुद्दे