MySQL C ++ соединительная петля - PullRequest
0 голосов
/ 07 ноября 2019
#include <iostream>
#include <sstream>
#include <string>

#include <mysql_connection.h>
#include <mysql_driver.h>
#include <mysql_error.h>

#include <cppconn/driver.h>
#include <cppconn/exception.h>

using namespace std;
using namespace sql;
using namespace mysql;
int main()
{
 Connection* con = nullptr;
 MySQL_Driver *driver = get_mysql_driver_instance();
 const SQLString server = "server.de";
 const SQLString user = "userName";
 const SQLString password = "password";

 while (1)
 {
  try {
   con = driver->connect(server, user, password);
  }
  catch (SQLException e) {
   printf("Fehler SQL Connect: %s \n", e.getSQLStateCStr());
   delete driver;
  }
  catch (...) {
   cerr << "Fehler SQL Connnect" << endl;
  }
  if (con)
  {
   con->close();
   delete con;
  }
  boost::detail::Sleep(5000);
 }
 return 0;
}

Я написал этот код и надеялся, что он будет выполняться в бесконечном цикле даже в случае сбоя оператора connect. Происходит следующее: после первого сбоя соединения он переходит к первому оператору catch и пишет «Fehler SQL Connect: HY000», как я и ожидал. В следующий раз, когда соединение завершается с ошибкой, программа разрывается, и в VS2017 я вижу, что «te923021119.exe вызвал точку останова». Почему программа не пытается бесконечно подключаться? НКТ

1 Ответ

1 голос
/ 07 ноября 2019

В вашем обработанном исключении вы звоните delete driver; Этот вызов уничтожает объект драйвера. Непонятно, правильно ли это делать, поскольку неясно, дает ли get_mysql_driver_instance() право собственности на динамически размещенный объект с new. Но независимо от того - в следующей итерации ваша программа пытается использовать driver - который был уничтожен. Так что - метинки не называют delete driver;. Еще лучше - используйте умные указатели, чтобы четко передать смысл владения. std :: unique_ptr может быть хорошим вариантом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...