mysql查询后调用mysql_free_result_怎么释放_关于mysql_free_result和mysql_close的解惑

之前用mysql的时候一直是在用短链接,调用mysql_store_result获取一次数据之后就直接调用:

以下是代码片段: mysql_free_result(m_result); mysql_close(m_Database);

但是有两个问题:

以下是引用片段:

1.当使用长连接时(即connect之后一直不close),如果最后会调用mysql_close,需不需要每次都调用mysql_free_result呢?

2.当mysql_close调用之后,m_result的数据是否还可以用。

先说一下结论:

1.必须每次调用。因为经过测试,每次mysql_store_result的指针都是不同的,可见并不是共享了同一块buf。

2.还是可以使用。经过valgrind扫描,只调用mysql_close的扫描结果是:

以下是引用片段: ==9397== 16,468 (88 direct, 16,380 indirect) bytes in 1 blocks are definitely lost in loss record 4 of 5 ==9397==    at 0x40219B3: malloc (vg_replace_malloc.c:195) ==9397==    by 0x8053EA2: my_malloc (in /data/home/dantezhu/appbase/application/platform/openqqcom/share/db_openright/test/test) ==9397==    by 0x806D314: mysql_store_result (in /data/home/dantezhu/appbase/application/platform/openqqcom/share/db_openright/test/test) ==9397==    by 0x804BB04: CMySQLCppClient::Result(st_mysql_res*&) (mysql_cpp_client.cpp:127) ==9397==    by 0x804AB58: CDBOpenRight::GetUinsByApp(unsigned int, std::set, std::allocator >&) (db_openright.cpp:58) ==9397==    by 0x8049F10: main (test.cpp:27)

这里连同测试代码和我之前写的一个简单的C++封装的mysql库一起放出下载,有需要的同学可以下载试试:

代码下载

其中只有mysql_cpp_client.h和mysql_cpp_client.cpp是核心文件,其他均为测试代码.

里面有简单的演示,如查询:

char strSql[MAX_QUERYLEN_OPENRIGHT];

snprintf(strSql,sizeof(strSql),"select uin \ from %s where appid=%u;",OPENRIGHT_TB_CARE,appid);

int ret;

ret = m_SqlClient.Execute(strSql);

if(ret)

{

snprintf(m_StrErrMsg,sizeof(m_StrErrMsg),"[%s][%d][%s]Error:[%d][%s]\n",

__FILE__,__LINE__,__FUNCTION__,ret,m_SqlClient.GetErrMsg());

return -1;

}

MYSQL_RES *result = NULL;

ret = m_SqlClient.Result(result);

if(ret)

{

snprintf(m_StrErrMsg,sizeof(m_StrErrMsg),"[%s][%d][%s]Error:[%d][%s]\n",

__FILE__,__LINE__,__FUNCTION__,ret,m_SqlClient.GetErrMsg());

return -2;

}

//这里很重要,做了析构时自动调用mysql_free_result

StCppResult freeRes(result);

unsigned int unRecords = mysql_num_rows(result);

if (0 == unRecords)

{

snprintf(m_StrErrMsg,sizeof(m_StrErrMsg),"[%s][%d][%s]Error: Result is empty\n",

__FILE__,__LINE__,__FUNCTION__);

return 0;

}

MYSQL_ROW row;

for(unsigned int unIndex = 0; unIndex < unRecords; unIndex++)

{

row=mysql_fetch_row(result);

unsigned uin = unsigned(atoi((char*)row[0]));

setUins.insert(uin);

}

return 0;

插入:

if(setUins.size() <= 0)

{

return 0;

}

if(setUins.size() > 1000)

{

snprintf(m_StrErrMsg,sizeof(m_StrErrMsg),"[%s][%d][%s]Error:[uins more than 1000]\n",

__FILE__,__LINE__,__FUNCTION__);

return -1;

}

string strValues;

char szValue[100];

for(set::iterator it = setUins.begin();it!=setUins.end();++it)

{

if (setUins.begin() == it)

{

snprintf(szValue,sizeof(szValue),TPL_ADDUIN2APP,*it,appid);

}

else

{

snprintf(szValue,sizeof(szValue),","TPL_ADDUIN2APP,*it,appid);

}

strValues.append(szValue);

}

char strSql[MAX_QUERYLEN_OPENRIGHT];

snprintf(strSql,sizeof(strSql),"insert into %s(uin,appid) VALUES %s;",OPENRIGHT_TB_CARE,strValues.c_str());

int ret;

ret = m_SqlClient.Execute(strSql);

if(ret)

{

snprintf(m_StrErrMsg,sizeof(m_StrErrMsg),"[%s][%d][%s]Error:[%d][%s]\n",

__FILE__,__LINE__,__FUNCTION__,ret,m_SqlClient.GetErrMsg());

return -2;

}

if(m_SqlClient.AffectRows()<=0)

{

snprintf(m_StrErrMsg,sizeof(m_StrErrMsg),"[%s][%d][%s]Error:[%d][%s]\n",

__FILE__,__LINE__,__FUNCTION__,ret,m_SqlClient.GetErrMsg());

return -3;

}

return 0;

OK,就这样。

FROM: http://blogread.cn/it/article/2495

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值