I test the mysql_real_quer y API, I just loop to execute Sql syntax ,like 'UPDATE ** SET **' there is a leak memory bug occur. when I use 'top' to check the bug, I find the system 'used memory' option will always growing until the system or process crush. but 'mysqld' and 'testsql' processes's %MEM option has not increase, System free memory look like disappear. I try to force kill the 'testsql' process but the memory still be used and can not be release. Why? Please help me.
Code:
int ThreadExeSQL(MYSQL* lpSQLConn, char * sql, int iLen) { if (mysql_real_query(lpSQLConn, sql, iLen)) { MYSQL_RES* lpGetSQLRes = mysql_store_result(lpSQLConn); mysql_free_result(lpGetSQLRes); return -1; } //mysql_errno(lpSQLConn); //mysql_error(lpSQLConn); MYSQL_RES* lpGetSQLRes = mysql_store_result(lpSQLConn); mysql_free_result(lpGetSQLRes); // release sql memory return 0; // success } void* ThreadSQL_HexWrite(void* lpGet) { LPThreadParam getParam = (LPThreadParam)lpGet; MYSQL* lpSQLConn = (MYSQL*)&getParam->lpSQLConn; int iThreadIdx = getParam->iThreadIdx; printf("ID:%d\n", iThreadIdx); mysql_thread_init(); lpSQLConn = mysql_init(NULL); if (!mysql_real_connect(lpSQLConn, g_host_name, g_user_name, g_password, g_db_name, g_db_port, NULL, 0)) { ThreadSQLError(lpSQLConn, NULL); return; } else { printf("mysql_real_connect OK!\n"); } for (int i = 0; i < 1000000; i++) { char lpCmdStr[8192] = "\0"; sprintf(lpCmdStr, "update %s set %s=0x%d where id=%d\0", "tb_Data", "Info", i, 1); if (ThreadExeSQL(lpSQLConn, (char*)lpCmdStr, strlen(lpCmdStr))) { MySQLError getError = ThreadSQLError(lpSQLConn, NULL); HandleMySqlError(getError); return; //erroe } else { printf("ok. "); } usleep(1000 * 10); } mysql_close(lpSQLConn); mysql_thread_end(); printf("ThreadSQL_HexWrite OK!\n"); } MYSQL* g_MySQLConnList[100]; void main() { if (mysql_library_init(0, NULL, NULL)) { printf("could not initialize MySQL client library\n"); exit(1); } int thread_num = 1; //while (true) { pthread_t *pTh = new pthread_t[thread_num]; for (int i = 0; i < thread_num; i++) { LPThreadParam lpSetParam = new ThreadParam; lpSetParam->lpSQLConn = (MYSQL*)&g_MySQLConnList[i]; lpSetParam->iThreadIdx = i; printf("---create thread idx:%d\n", i); if (0 != pthread_create(&pTh[i], NULL, ThreadSQL_HexWrite, lpSetParam)) { printf("pthread_create failed\n"); continue; } } for (int i = 0; i < thread_num; i++) { pthread_join(pTh[i], NULL); } delete[] pTh; } mysql_library_end(); printf("All Done!\n"); }
Comment