[PostgreSQL] – 服务器端通知

PostgreSQL 支持从服务器端向客户端主动推送通知信息,前提是客户端监听指定名称的通知。这样做的好处是客户端可以监测服务器端的数据改变,以便更新本地的数据等行为,尤其是适合字典类型的数据及时更新。

首先,客户端使用 Listen 指令来通知服务器自己要监听的通知的名称。然后一旦有人触发了这个通知(如果触发是在事务中,则事务完成后实际通知),客户端就会收到相应的通知信息。比如先执行下面的脚本监听 DictionaryChanged 通知:

listen DictionaryChanged;

然后在其它地方触发该通知:

notify DictionaryChanged,'{"table":"dict_cities","action":"insert","rowid":8788}';

在我们的客户端就会收到该通知:

'dictionarychanged'的异步通知已从后台进程 pid 29738  收到。
   数据: {"table":"dict_cities","action":"insert","rowid":8788}

这里注意一点,通知的附加的字符串数据长度最大为8KB,但它的值可以在配置文件中修改。个人推荐结合QJSON使用JSON格式来传送通知参数,以方便解析和处理。

在不再关心该通知时,只需要用 Unlisten 指令移除监听就可以了。

unlisten DictionaryNotify;

是不是感觉很方便:)

好了,切换到 QDAC 中 QDB 单元,TQProvider 将提供这么一组接口,来隐藏服务器端的这些东西。

/// <summary>监听服务器上指定名称的通知</summary>
/// <param name="AName">要监听的通知名称</param>
procedure Listen(const AName: QStringW); virtual;
/// <summary>取消对指定名称的通知的监听</summary>
procedure Unlisten(const AName: QStringW); virtual;
/// <summary>触发服务器上特定名称的通知</summary>
/// <param name="AName">要发送的通知名称</param>
/// <param name="APayload">要发送的通知内容字符串</param>
procedure Notify(const AName: QStringW; const APayload: QStringW); virtual;

Listen/Unlisten/ Notify分别对应 PgSQL 的相应操作,一旦接收到服务器端发送的通知,TQProvider.OnNotify事件就会触发,然后剩下的就是你自己的代码处理了,看起来会很方便的。

分享到: