博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PostgreSQL 10.1 手册_部分 IV. 客户端接口_第 33 章 libpq - C 库_33.8. 异步提示
阅读量:6211 次
发布时间:2019-06-21

本文共 1208 字,大约阅读时间需要 4 分钟。

33.8. 异步提示

PostgreSQL通过LISTENNOTIFY命令提供了异步通知。一个客户端会话用LISTEN命令在一个特定的通知频道中注册它感兴趣的通知(也可以用UNLISTEN命令停止监听)。当任何会话执行一个带有特定频道名的NOTIFY命令时,所有正在监听该频道的会话会被异步通知。可以传递一个载荷字符串来与监听者沟通附加的数据。

libpq应用把LISTENUNLISTENNOTIFY命令作为通常的 SQL 命令提交。 随后通过调用PQnotifies来检测NOTIFY消息的到达。

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

PGnotify *PQnotifies(PGconn *conn);typedef struct pgNotify{    char *relname;              /* notification channel name */    int  be_pid;                /* process ID of notifying server process */    char *extra;                /* notification payload string */} PGnotify;

在处理完PQnotifies返回的PGnotify对象后,别忘了用PQfreemem把它释放。释放PGnotify指针就足够了;relnameextra域并不代表独立分配的内存(这些域的名称是历史性的,尤其是频道名称与关系名称没有什么联系)。

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

PQnotifies实际上并不从服务器读取数据;它只是返回被另一个libpq函数之前吸收的消息。在以前的libpq版本中,及时收到NOTIFY消息的唯一方法是持续地提交命令,即使是空命令也可以,并且在每次PQexec后检查PQnotifies。 虽然这个方法还能用,但是由于太过浪费处理能力已被废弃。

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

本文转自PostgreSQL中文社区,原文链接:

转载地址:http://lqdja.baihongyu.com/

你可能感兴趣的文章
linux下通配符及I/O重定向
查看>>
Otter-入门篇1(阿里开源项目Otter介绍)
查看>>
SVN安装步骤
查看>>
使用Powershell批量设置Exchange 2013 虚拟目录URL
查看>>
网站各种报错解析not found,404,forbiden,403
查看>>
CentOS 7,使用yum安装Nginx
查看>>
DefaultHandler中方法解读
查看>>
vim 编辑器常用命令
查看>>
Spring Batch 背景
查看>>
flume-ng学习
查看>>
系统集成资质培训 - 关于变更
查看>>
IT人怎么赶走不快乐的心情?
查看>>
MySQL新增字段、修改字段位置和查询存储过程的SQL代码
查看>>
git: fatal: Could not read from remote repositorygit: fatal: Could not read from remote repository
查看>>
php编译安装加入service
查看>>
你的隐私安全吗:Cookie到底是什么?
查看>>
MySQL的复制
查看>>
vi命令大全
查看>>
找不到或无法加载主类HelloWorldAPP?
查看>>
IE通过注册表设置每次检查较新版本
查看>>