2015-10-07 69 views
1

我使用的是mysql c++ connector。我想連接到我的數據庫,並保持連接並重新連接,如果連接消失。mysql C++連接器,如何保持連接活動並重新連接,如果連接中斷?

這裏是一個代碼連接:

driver = sql::mysql::get_driver_instance(); 
connection = driver->connect(Server, UserID, Password); 

here它說,該方法連接 - > isValid()的和重新連接()是知道的連接是否還活着,並重新連接,如果它不。所以我這個洞:

bool MySqlCommunicator::Connect() 
{ 
    try 
    { 
     bool connected = connection != NULL && (connection->isValid() || connection->reconnect()); 

     if (!connected) 
     { 
      connection = driver->connect(Server, UserID, Password); 
      connected = connection->isValid();     
     } 

     if (connected) 
     { 
      statement = connection->createStatement(); 
      char str[255]; 
      sprintf(str, "USE %s", Database); 
      statement->execute(str); 
      return true; 
     } 
     return false; 
    } 
    catch (sql::SQLException &e) 
    { 
     delete connection; 
     connection = NULL; 
     return false; 
    }  
} 

的話,我想執行一個查詢我調用Connect每次(),以確保連接已準備就緒。如果連接不活動,我假設Connect()方法將重新連接。

但在到達該線的時候,程序崩潰:

  bool connected = connection != NULL && (connection->isValid() || connection->reconnect()); 

它不能執行isValid()方法,該程序與消息段故障退出。

好,我改變了代碼如下:

bool MySqlCommunicator::Connect() 
{ 
    try 
    { 
     bool connected = connection != NULL; //connection != NULL && (connection->isValid() || connection->reconnect()); 

     if (!connected) 
     { 
      connection = driver->connect(Server, UserID, Password); 
      //connected = connection->isValid(); 
      connected = true; 
     } 

     if (connected) 
     { 
      statement = connection->createStatement(); 
      char str[255]; 
      sprintf(str, "USE %s", Database); 
      statement->execute(str); 
      return true; 
     } 
     return false; 
    } 
    catch (sql::SQLException &e) 
    { 
     delete connection; 
     connection = NULL; 
     return false; 
    }  
} 

現在的作品!如果發生任何錯誤,它將重新連接,使其正確。但這不是一個解決方案!我想要一個適當的解決方案。

  • 爲什麼我的第一個代碼在上述行中崩潰?
  • 其他方法像connection-> setReadOnly()也會使程序崩潰!它的原因是什麼?
  • 確保連接有效的最佳方法是什麼?
  • 如果發生錯誤,重新連接到遠程數據庫的最佳做法是什麼?

(提前等待有人來回答!謝謝)

回答

1

挖我找到了解決方案小時後。我交叉編譯了更新版本的mysql C++連接器,並用它來編譯和運行我的代碼。現在方法isValid()和reconnect()正在工作。 (setreadOnly()方法似乎還沒有實現)。

和我最後的工作代碼爲:

bool MySqlCommunicator::Connect() 
{ 
    try 
    { 
     bool connected = connection != NULL && (connection->isValid() || connection->reconnect()); 

     if (!connected) 
     { 
      connection = driver->connect(Server, UserID, Password); 
      connected = connection->isValid(); 
     } 

     if (connected) 
     { 
      //connection->setReadOnly(false); 

      statement = connection->createStatement(); 
      char str[255]; 
      sprintf(str, "USE %s", Database); 
      statement->execute(str); 
      return true; 
     } 
     return false; 
    } 
    catch (sql::SQLException &e) 
    { 
     delete connection; 
     connection = NULL; 
     return false; 
    } 

}