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事件就会触发,然后剩下的就是你自己的代码处理了,看起来会很方便的。