MYSQL C连接器

时间:2011-10-11 07:09:12

标签: mysql c linux

我有一个快速写入mysql数据库的C进程〜每秒10次。此过程使用MySql C连接器。

运行约2分钟后,进程挂起并在系统监视器中显示

 "futex_wait_queue_me"

,还有

"Can't initialized threads: error 11" 

打印到控制台,我假设是C连接器库(因为我不打印它)。在写入之后,与mysql的连接失败并带有

"MySQL server has gone away".

可能导致这种情况的原因是什么?我只是从一个帖子写作。

是的,我正在使用这个库。互联网锁定和解锁是未来因为我将多线程记录日志。实际应用中的日志事件将不那么频繁,但我试图在这个特定的测试中尽可能地强调它。

//pseudocode:
while(1)
    mutexlock
    connect();
    mysql_query();
    disconnect();
    sleep(100ms);
    mutexunlock


A better solution, maybe not the best
    connect();
    while(1)
        mutexlock

        if error on mysql_query();
            disconnect();
            connect();
        sleep(100ms);
        mutexunlock



//connect/disconnect functions
int DBConnector::connect()
{
    if(DBConnector::m_isConnected) return 0;//already connected...
    if(!mutexInitialized)
    {
        pthread_mutex_init(&DBLock, 0);
    }
    if(mysql_library_init(0, NULL, NULL))
    {
        LoggingUtil::logError("DBConnector.DB_connect [DB library init error] " + string(mysql_error(&DBConnector::m_SQLHandle)));
        DBConnector::m_isConnected = false;
        return -1;
    }

    if((mysql_init(&m_SQLHandle)) == NULL)
    {      
        LoggingUtil::logError("DBConnector.DB_connect [DB mysql init error] " + string(mysql_error(&DBConnector::m_SQLHandle)));
        DBConnector::m_isConnected = false;
        return -1;
    }

   if((mysql_real_connect(&DBConnector::m_SQLHandle, host.c_str(), user.c_str(), pw.c_str(), db.c_str(), port, socket.c_str(), client_flags)) == NULL)
   {
       LoggingUtil::logError("DBConnector.DB_connect [DB Connect error] " + string(mysql_error(&DBConnector::m_SQLHandle)));
       DBConnector::m_isConnected = false;
       return -1;
   }   

    DBConnector::m_isConnected = true;
    return 0;
}
int DBConnector::disconnect()
{
    DBConnector::m_isConnected = false;
    mysql_close(&DBConnector::m_SQLHandle);

    mysql_library_end();
    return 0;
}

1 个答案:

答案 0 :(得分:1)

尽量不要打电话

mysql_library_init(0, NULL, NULL);

mysql_library_end();

每次连接尝试。

另外,你不想在每次mysql访问时重新连接的第二个想法要好得多,因为建立连接总是需要一些时间/资源。在你的情况下没有任何意义。

查询失败后,您无需重新连接到数据库。