以下の関数は、パラメーターとして conn を渡した各スレッドが接続を切り離すことができないため、巨大な接続リークを引き起こす原因であることが判明しました。
すべてのクエリは期待どおりに機能しますが、mysql_close()
関数だけで接続スレッドが停止しなくなりました。
この機能は正常に機能し、最後に機能してから何も変更した覚えがありません。それが使用されたプロジェクトといくつかのコンパイラフラグを変更しただけです。
私はドキュメントを読みました:
ハンドルが mysql_init() または mysql_connect() によって自動的に割り当てられた場合、 mysql_close()は mysql が指す接続ハンドルの割り当てを解除します。
しかし、理解できず、テスト方法もわかりません。
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;
}