yes. g_MySQLConnList fill with like 'new MYSQL[100]'; In fact, in my testing environment the code always query mysql successful, but leak memory.
N
normga
@normga
Posts
-
CentOS6.9 (MySql v5.7.22) use mysql C API mysql_real_query cause the memory always growing -
CentOS6.9 (MySql v5.7.22) use mysql C API mysql_real_query cause the memory always growingI test the mysql_real_query 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.
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); continue; //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 lpSetPar