函数导致mysql_close()使连接线程保持打开状态

时间:2014-02-18 01:13:43

标签: c++ mysql multithreading mysqlconnection

下面的函数被发现导致巨大的连接泄漏,因为作为参数传递conn的每个线程都获得了不可连接的连接。

所有查询都按预期工作,只有mysql_close()函数不再停止连接线程。

此功能运行良好,我不记得改变任何东西,因为它上次工作。刚刚更改了使用它的项目和一些编译器标志。

我已在documentation中读到:

  

mysql_close()如果句柄释放mysql指向的连接句柄   由mysql_init()或mysql_connect()自动分配。

但不明白,也不知道如何测试。

int mysql_get_item_id(MYSQL *conn, const char *item_e, const unsigned long * ip_nr, bool *is_new_item = NULL)
{
    char ip_nr_string[10];
    std::sprintf(ip_nr_string, "%lu", *ip_nr);

    string query="SELECT id FROM item_unique WHERE item='"+(string)item_e+"' LIMIT 1";
    if(mysql_real_query(conn, &query[0],query.size()))
    {
        cout<<endl<<"mysql_get_item_id -> query fail: <<"<<query<<">>"<<endl;
        fprintf(stderr, "%s\n", mysql_error(conn));

        return 0;
    }
    else if(DEBUG_QUERY > 2)
    {
        cout<<"debug_query <<"<<query<<">>"<<endl;
    }
    MYSQL_RES *result = mysql_store_result(conn);
    MYSQL_ROW row;
    if(mysql_affected_rows(conn)>0)
    {
        if( ( row = mysql_fetch_row(result)) != NULL )
        {
            if(row[0] != NULL)
            {
                long l=atoi(row[0]);
                mysql_free_result(result);
                return l;
            }
        }
    }
    // if no != NULL found

    query="INSERT IGNORE INTO item_unique(item,host_ip_nr) VALUES ('"+(string)item_e+"', '"+(string)ip_nr_string+"')";
    if(mysql_real_query(conn, &query[0],query.size()))
    {
        cout<<endl<<"mysql_get_item_id -> query fail: <<"<<query<<">>"<<endl;
        fprintf(stderr, "%s\n", mysql_error(conn));
        return 0;
    }
    else if(DEBUG_QUERY > 2)
    {
        cout<<"debug_query <<"<<query<<">>"<<endl;
    }
    if(mysql_affected_rows(conn)>0)
    {
        if (is_new_item != NULL) *is_new_item=TRUE;
        return mysql_insert_id(conn);
    }
    else
    {
        return 0;
    }
    return 0;
}

0 个答案:

没有答案