之前用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的解惑相关推荐

  1. mysql 查询后根据值的不同进行判断与修改,SQL中的条件判断语句(case when zhen)用法

    需求: mysql 查询后根据值的不同进行判断与修改 语法结构: SQL中的条件判断语句(case when zhen)用法 SELECT A.品号,属性,        CASE           ...

  2. MYSQL查询后出现中文乱码怎么办

    MYSQL 查询后出现中文乱码 解决方案:输入set names gb2312 后回车 然后再次查询

  3. mysql查询到最新记录就停止_使用Limit参数优化MySQL查询 在找到一个记录后将停止查询...

    优化 MySQL 查询的 Limit 参数 我们在做一些查询的时候总希望能避免数据库引擎做全表扫描,因为全表扫描时间长,而且其中大部分扫描对客户端而言是没有意义的.那么在 MySQL 中有那些方式是可 ...

  4. python循环次数查询_大数据量Mysql查询后经过循环使用python分片

    1 问题描述: (1)使用mysql查询基础数据,这里只有三四个基础的查询条件,联了一个表,同时有limit分页了: (2)之后经过一系列逻辑处理,在这些处理中又包含了很多sql查询,而且是在第(1) ...

  5. mysql查询一个表有哪些索引_如何查看某张数据库表上都有哪些索引(转)

    索引使用简介 一. 关于索引的知识 要写出运行效率高的sql,需要对索引的机制有一定了解,下面对索引的基本知识做一介绍. 1. 索引的优点和局限 索引可以提高查询的效率,但会降低dml操作的效率. 所 ...

  6. mysql查询时调用函数_【性能测试】性能测试时对Mysql数据库的慢查询监控

    在做Web项目性能测试过程中,肯定要对数据库SQL语句执行情况实施监控,以便给开发提供准确的性能优化意见.目前Mysql数据库可以说是使用最广泛的数据库了,接下来咱们谈一下怎么使用Mysql数据库提供 ...

  7. mysql查询后从高到低排序_[MySQL基础]三、排序查询

    排序查询 语法: SELECT 查询列表 FROM 表 [WHERE 筛选条件] ORDER BY 排序列表 [ASC|DESC]; #[ ]中的内容表示可选 特点:asc代表的是升序,desc代表的 ...

  8. mysql查询各类课程的总学分_基于jsp+mysql的JSP学生选课信息管理系统

    运行环境: 最好是java jdk 1.8,我们在这个平台上运行的.其他版本理论上也可以. IDE环境: Eclipse,Myeclipse,IDEA都可以 硬件环境: windows 7/8/10 ...

  9. mysql查询集合中的特定数据_快速查询List中指定的数据

    时间:2017/5/15 作者:李国君 题目:快速查询List中指定的数据 背景:当List中保存了大量的数据时,用传统的方法去遍历指定的数据肯定会效率低下,有一个方法就是类似于数据库查询那样,根据索 ...

最新文章

  1. opencv把图片转换成二进制_如何增强图像,然后使用Python和OpenCV将其转换为二进制图像?...
  2. instant apps_Android Instant Apps 101:它们是什么以及它们如何工作
  3. android studio写坦克大战代码_GitHub 项目推荐:俄罗斯小游戏、Markdown 幻灯片、头像生成器、Logo 制作、坦克大战...
  4. 用wget做站点镜像
  5. 国内用得最多的框架,它排第一!
  6. 如何判断字符串所用何种加密编码
  7. 不同版本的Chrom浏览器对应的ChromDriver的版本
  8. 【BZOJ3700】发展城市 [LCA][RMQ]
  9. GRE核心词汇助记与精练-List9切分、部分
  10. Python 编辑注意点
  11. 【Vue-Router】模拟源码,解析 Vue-Router 的实现原理
  12. 问题四十四:怎么用ray tracing画空间任意位置的圆环的任意片段
  13. Java WebService使用简单教程
  14. 三进制计算机基本原理,三进制(三进制计算机)
  15. 通信原理包络是什么意思_为什么齿轮不能少于17个齿,少于17个齿,齿轮传动会如何?...
  16. python 二项分布
  17. 毛笔字软件测试简历,写字测试
  18. 好奇心和求知欲是什么
  19. CUDA安装和检测【全】(nvcc命令找不到的解决办法)
  20. 计算机无法设置双屏显示,电脑双屏显示怎么设置?

热门文章

  1. 浅析低功耗广域网及在智慧城市中的应用
  2. 在容器上构建持续部署,这份超详细实践指南不要错过!
  3. 参数设置_变频器基本参数设置
  4. python socket能做什么_[python]初探socket
  5. vue如何在末尾添加_怎样在Linux上开发vue项目
  6. python项目部署访问特别卡_【python新人求助】flask+pymssql 通过wsgi发布到Apache,访问接口服务器卡死?...
  7. 一文简单弄懂tensorflow_在tensorflow中设置梯度衰减
  8. 解决VScode自动保存时在语句后疯狂加分号
  9. (企业案例)Nacos Config 进阶使用
  10. 搭建主从数据库出现的错误 error connecting to master ‘slave@172.17.0.2:3306‘ - retry-time: 30 retries: 1