CentOS6.9 (MySql v5.7.22) use mysql C API mysql_real_query cause the memory always

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • gamehan101
    New Member
    • May 2019
    • 2

    CentOS6.9 (MySql v5.7.22) use mysql C API mysql_real_query cause the memory always

    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");
    
    }
  • gamehan101
    New Member
    • May 2019
    • 2

    #2
    Code:
    for (int i = 0; i < 1000000; i++) 
    {
     ......
      if (ThreadExeSQL...)
       { 
          ...... 
          continue; // this line change to continue; code copy with a little mistake. 
        } 
    
    }

    Comment

    Working...