下面的函数被发现导致巨大的连接泄漏,因为作为参数传递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;
}