PostgreSQL 9.4.4 中文手册 | |||
---|---|---|---|
上一页 | 上一级 | 章 31. libpq - C 库 | 下一页 |
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
,看看在处理命令的过程中是否有通知到达。