↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1
历史版本PostgreSQL 7.4 已于 2010 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

27.6. 异步通知 #

PostgreSQL通过LISTEN和NOTIFY命令提供异步通知。客户端会话可使用LISTEN命令注册其感兴趣的特定通知通道(也可以用UNLISTEN命令停止监听)。当任何会话执行带有该通道名的NOTIFY命令时,所有监听该通道的会话都会异步收到通知。

libpq应用把LISTEN、UNLISTEN和NOTIFY命令作为普通 SQL 命令提交。 随后通过调用PQnotifies来检测 NOTIFY 消息的到达。

函数 PQnotifies 从服务器发来的尚未处理的通知消息列表中返回下一条通知。如果没有待处理的通知则返回空指针。一条通知被 PQnotifies 返回后即视为已处理,并会从通知列表中移除。

PGnotify* PQnotifies(PGconn *conn);

typedef struct pgNotify {
    char *relname;              /* notification condition name */
    int  be_pid;                /* process ID of server process */
    char *extra;                /* notification parameter */
} PGnotify;

处理完 PQnotifies 返回的 PGnotify 对象后,务必用 PQfreemem 释放它。只需释放 PGnotify 指针本身即可; relname 和 extra 字段并不是独立分配的。(目前 extra 字段未使用,总是指向一个空字符串。)

注意

在PostgreSQL 6.4 及之后的版本中,be_pid是发送通知的服务器进程的 PID,而在较早的版本中它总是你自己的服务器进程的PID。

例 27.2给出了一个示例程序展示异步通知的使用。

PQnotifies实际上并不从服务器读取数据;它只是返回之前已被其他libpq函数读取的消息。 在较早版本的libpq中,及时收到NOTIFY消息的唯一方法是不断提交命令,哪怕是空命令,然后在每次PQexec后检查PQnotifies。 虽然这种方法仍然有效,但由于浪费处理能力,现已弃用。

当没有需要执行的实际命令时,一种更好的检查NOTIFY消息的方法是调用PQconsumeInput,然后检查PQnotifies。 你可以使用select()等待服务器数据到达,这样在无事可做时就不会浪费CPU资源(参见PQsocket以获得可传给select()的文件描述符)。 注意不管是用PQsendQuery/PQgetResult提交命令还是简单地使用PQexec,这种方法都能正常工作。 不过,你应该记住在每次PQgetResult 或 PQexec之后检查PQnotifies,看看在命令的处理过程中是否有通知到达。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。