日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發布時間:2024/9/27 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的mysql查询后调用mysql_free_result_怎么释放_关于mysql_free_result和mysql_close的解惑的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。