3

我正在为 MySQL 5.5 编写我的第一个 C 客户端,并且偶然发现了文档中的以下页面。几乎在最后,它说(粗体强调我的,斜体强调不是我的):

mysql_use_result() 的一个优点是 [...]。缺点是[...]。此外,您必须检索所有行,即使您在检索过程中确定您已经找到了您正在寻找的信息。

最后一句话我不清楚。

1)如果我不遵循这条线会发生什么?

2)我认为如果我确定我有足够的信息,实际上必须有一种方法可以过早地结束获取行(否则,这整个事情在我看来没有多大意义)。

我知道如果我只是停止获取行然后尝试执行下一条语句,可能会发生一些不好的事情,但是没有像 mysql_finish_fetch() 或类似的函数吗?

如果我打电话会发生什么mysql_free_result()?即使我还没有获取所有行,这也应该释放结果,因此在检索过程中调用它并继续我想做的任何事情都应该是安全的。我在这里错了吗?

4

1 回答 1

3

这听起来像是 MySQL 向客户端公开的内部线程问题。将其归结为各种MySQL 陷阱。不足之处在于 MySQL 内部显然有有限数量的“搜索器”,并且mysql_use_result()显然使用其中一个专用于您的 API 请求。此外,MySQL 显然没有公开的 API 调用来取消这样的请求。唯一的选择是看到提取直到结束。

稍长的版本:在内部,MySQL 的游标显然只有一个代码路径——我想在常见情况下的性能。当光标找不到更多结果时,该代码路径才会退出。当您使用更常见的mysql_store_result()时,MySQL 在将结果返回给应用程序之前已经这样做了。但是,当您使用mysql_use_result()时,MySQL 要求您执行迭代其余结果集以清除游标的“脏活”。乐趣。

文档中:

mysql_use_result()启动结果集检索,但实际上并不像这样做那样将结果集读入客户端mysql_store_result()。相反,必须通过调用 来单独检索每一行mysql_fetch_row()。这直接从服务器读取查询结果,而不将其存储在临时表或本地缓冲区中,这比mysql_store_result(). 客户端只为当前行和一个可能增长到max_allowed_packet字节的通信缓冲区分配内存。

另一方面,mysql_use_result()如果您在客户端对每一行进行大量处理,或者如果将输出发送到用户可以键入 a ^S(停止滚动)的屏幕,则不应使用锁定读取。这会占用服务器并阻止其他线程更新从中获取数据的任何表。

使用 时mysql_use_result(),必须执行mysql_fetch_row()直到返回 NULL 值,否则,未提取的行将作为下一个查询的结果集的一部分返回。Commands out of sync; you can't run this command now如果您忘记执行此操作,C API 会给出错误!

因此,要实际回答您的问题:

1)如果我不遵循这条线会发生什么?

C API 将返回错误消息:Commands out of sync; you can't run this command now

2)我认为如果我确定我有足够的信息,实际上必须有一种方法可以过早地结束获取行(否则,这整个事情在我看来没有多大意义)。

有人会想,但没有。您必须完全迭代结果集。

于 2017-11-14T14:08:46.707 回答