PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 章 31. libpq - C 库 | 下一页

# 31.8. 异步通知

PostgreSQL通过`LISTEN`和`NOTIFY` 命令提供对异步通知的支持。一个客户端会话用`LISTEN`命令注册一个它感兴趣的通知条件 （也可以用`UNLISTEN`命令停止监听）。所有正在监听某一通知条件的会话在该条件名的 `NOTIFY`（通知）被任何会话执行后都将被异步地通知。 一个"payload"可以向听众传达额外的数据。

libpq应用把`LISTEN`，`UNLISTEN` 和`NOTIFY`命令作为普通的 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` 指针就足够了；`relname`和`extra` 字段并未代表独立分配的内存。（这些领域的名称是历史性的，尤其是频道名称与名称没有什么关系。）

例 31-2给出了一个简单的程序，举例说明异步通知的使用。

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

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

上一页 | 起始页 | 下一页
捷径接口 | 上一级 | 与`COPY`命令相关的函数