Функция, приведенная ниже, была признана ответственной за огромную утечку соединения, так как каждый поток, передавший conn в качестве параметра, получал неразрывное соединение.
Все запросы работают как положено, просто mysql_close()
функция больше не останавливает поток соединения.
Эта функция работала нормально, и я не помню, чтобы что-либо менять, так как она работала в последний раз. Просто изменил проект, где он использовался и некоторые флаги компилятора.
Я прочитал в документация тот :
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;
}
Задача ещё не решена.
Других решений пока нет …