mysql - CentOS6.9(MySql v5.7.22)使用mysql C API mysql_real_query导致内存总是增长

标签 mysql c api centos

我测试了 mysql_real_query API,我只是循环执行 Sql 语法,例如“UPDATE ** SET **”,出现泄漏内存错误。当我使用“top”检查错误时,我发现系统“已用内存”选项将始终增长,直到系统或进程崩溃。但是'mysqld'和'testsql'进程的%MEM选项没有增加,系统可用内存看起来消失了。我尝试强制终止“testsql”进程,但内存仍在使用且无法释放。为什么?请帮助我。

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; //error
        }
        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");

}

最佳答案

当 ThreadExeSQL() 失败时,您的连接不会关闭。

关于mysql - CentOS6.9(MySql v5.7.22)使用mysql C API mysql_real_query导致内存总是增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56275198/

相关文章:

c - 内存映射一个固定位置的数组

javascript - 如何从 randomuser API 获取用户的用户详细信息?

node.js - 如何通过 Node.js 的电报数据库库(TDLib)请求用户的所有聊天/群组

c - 为什么我在执行以下 C 代码 : 时收到错误 "Expression Syntax"

php - 一起使用 Laravel 和 Lumen

java - 如何使用带有 "select"关键字的 MySql 存储过程迭代 ResultSet?

php - 通配符 mysql LIKE 或 IN 数组值问题

mysql - SQL、组织节点、层次结构

MySQL root 用户 UPDATE 命令被拒绝

bool 运算的结果可以比较吗?