mysql c ++连接器,如果连接断开,如何保持连接活动并重新连接?

时间:2015-10-07 22:43:04

标签: c++ mysql odbc mysql-connector

我正在使用mysql c++ connector。我想连接到我的数据库,如果连接消失,继续连接并重新连接。

这是一个连接代码:

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

here它表示方法connection-> isValid()和reconnect()可以知道连接是否处于活动状态,如果不存在则重新连接。所以我想这个:

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 个答案:

答案 0 :(得分:2)

经过数小时的挖掘后,我找到了解决方案。我交叉编译了较新版本的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;
    }

}