返回介绍

I. 教程

II. SQL 语言

III. 服务器管理

IV. 客户端接口

V. 服务器端编程

VI. 参考手册

VII. 内部

VIII. 附录

28.5. 取消正在处理的查询

发布于 2019-09-30 03:07:57 字数 1799 浏览 874 评论 0 收藏 0

一个客户端应用可以使用本节描述的函数,要求取消一个仍在被服务器处理的命令。

PQgetCancel

创建一个数据结构,这个数据结构包含通过特定数据库连接取消一个命令所需要的信息。

PGcancel *PQgetCancel(PGconn *conn);

给出一个 PGconn 连接对象,PQgetCancel 创建一个PGcancel 对象。如果给出的 conn 是 NULL 或者是一个无效的连接,那么它将返回 NULL。PGcancel 对象是一个不透明的结构,不应该为应用所直接访问;我们只能把它传递给PQcancel 或者PQfreeCancel

PQfreeCancel

释放PQgetCancel 创建的数据结构。

void PQfreeCancel(PGcancel *cancel);

PQfreeCancel 释放一个由前面的PQgetCancel创建的数据对象。

PQcancel

要求服务器放弃处理当前命令。

int PQcancel(PGcancel *cancel, char *errbuf, int errbufsize);

如果取消请求成功发送,则返回值为 1,否则为 0。如果不成功,则 errbuf 里面会填充一些错误信息,解释为何不成功。errbuf 必须是一个大小为 errbufsize 的 char 数组(建议大小为 256 字节)。

不过,成功发送取消请求并不保证请求会有任何效果。如果取消生效,那么当前的命令将提前结束并且返回一个错误的结果。如果取消失败(也就是说,因为服务器已经完成命令的处理),那么就根本不会有可见的结果。

如果 errbuf 是信号句柄里的一个局部变量,那么PQcancel 可以在一个信号句柄里安全地调用。在PQcancel 涉及的范围里,PGcancel 对象都是只读的,因此我们也可以从一个与处理 PGconn 对象的线程分离的线程里处理它。

PQrequestCancel

要求服务器放弃处理当前命令。

int PQrequestCancel(PGconn *conn);

PQrequestCancelPQcancel 的一个废弃的变种。它直接在 PGconn 对象上进行操作,并且如果失败,就会在 PGconn对象里存储错误信息(因此可以用PQerrorMessage 检索出来。)尽管功能一样,但是这个方法在多线程程序里和信号句柄里会有危险,因为它可能覆盖 PGconn 的错误信息,因此将可能把当前连接正在处理的操作打乱。

<
PrevHomeNext
异步命令处理Up捷径接口

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文