返回介绍

I. 教程

II. SQL 语言

III. 服务器管理

IV. 客户端接口

V. 服务器端编程

VI. 参考手册

VII. 内部

VIII. 附录

28.7. 异步通知

发布于 2019-09-30 03:08:13 字数 1994 浏览 1057 评论 0 收藏 0

PostgreSQL通过LISTENNOTIFY命令提供对异步通知的支持。一个服务器用LISTEN命令注册一个它感兴趣的通知条件(也可以用UNLISTEN命令停止监听)。所有正在监听某一通知条件的会话在该条件名的NOTIFY(通知)被任何会话执行后都将被异步地通知。通知发出者不会传递附加的信息到监听者。因此,很典型地是,任何实际的需要被传递的数据都是通过一个数据库表传递的。通常,条件名与相关联的表同名,但是并不是一定要与某个表相关才行。

libpq 应用把LISTENUNLISTEN命令作为通常的 SQL 命令提交。随后通过调用PQnotifies()可以侦测到NOTIFY 消息的到达。

函数PQnotifies从一个来自服务器的未处理的通知信息列表中返回下一条通知。如果没有未处理的信息则返回 NULL 指针。一旦PQnotifies返回一条通知,该通知会被认为已处理并且将被从通知列表中删除。

PGnotify *PQnotifies(PGconn *conn);typedef struct pgNotify {    char *relname;   /* 通知名字*/    int  be_pid;   /* 服务器进程 id*/    char *extra;                /* 通知参数 */} PGnotify;

在处理完PQnotifies 返回的PGnotify对象后,别忘了用PQfreemem() 把它释放,以避免内存泄漏。释放 PGnotify 指针就足够了;relnameextra字段并未代表独立分配的内存。(目前,extra 字段没有使用,并且将总是指向一个空字串。)

注意: 在 PostgreSQL 6.4 和更高的版本里,be_pid 是正在通知的服务器的 PID,而在早些的版本里它总是你自己的服务器的PID。

Example 28-2 给出了一个使用异步通知的例子。

PQnotifies() 实际上并不读取服务器数据;它只是返回被前面的另一个libpq函数吸收的信息。在以前的 libpq 的版本里,周期性的收到NOTIFY信息的唯一方法是持续的提交命令,即使是空查询也可以,并且在每次PQexec()后检查PQnotifies() 。现在这个方法也能还工作,不过我们认为它太浪费处理器时间而废弃了它。

在你没有可用的命令提交时检查NOTIFY消息的更好的方法是调用PQconsumeInput(),然后检查PQnotifies()。你可以使用select() 来等待服务器数据的到达,这样在没有数据可处理时可以不浪费 CPU 时间。(参阅PQsocket() 获取用于select()的文件描述符。)注意这种方法不管你使用PQsendQuery/PQgetResult 还是简单的PQexec来执行命令都能工作。不过,你应该记住在每次PQgetResultPQexec后检查PQnotifies() ,看看在处理命令的过程中是否有通知到达。

<
PrevHomeNext
捷径接口UpCOPY命令相关的函数

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

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

发布评论

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