微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgresql – 使用node-postgres进行LISTEN查询超时?

我在 Postgresql 9.1数据库上有一个文章”表和一个通知每个插入的通道的触发器.

我想创建一个node.js脚本来捕获这些插入并使用Socket.io将通知推送到连接的客户端.到目前为止,我正在使用node-postgres模块LISTEN到通道,但似乎LISTEN查询在大约10-15秒后超时并停止捕获插入.我可以在超时发生时查询新的监听,但我不确定如何正确实现延续.

这是我的postgresql通知程序:

CREATE FUNCTION article_insert_notify() RETURNS trigger AS $$
BEGIN
  NOTIFY "article_watcher";
  RETURN NULL;
END;
$$LANGUAGE plpgsql;

触发:

CREATE TRIGGER article_insert_trigger
AFTER INSERT ON article
FOR EACH ROW EXECUTE PROCEDURE article_insert_notify();

而node.js代码

var pg = require ('pg'),pgConnection = "postgres://user:pass@localhost/db"

pg.connect(pgConnection,function(err,client) {
    client.query('LISTEN "article_watcher"');
    client.on('notification',function(data) {
        console.log(data.payload);
    });
});

如何确保全职LISTEN或如何捕获这些超时以重新发出侦听查询?或者,node-postgres以外的模块可能提供更合适的工具吗?

我在node-postgres repo上得到了我的问题的答案.引用Brianc:

pg.connect is use to create pooled connections. Using a connection
pool connection for listen events really isn’t supported or a good
idea though.
[…]
To ‘listen’ a connection by deFinition must stay open permanently. For
a connection to stay open permanently it can never be returned to the
connection pool.

在这种情况下,正确的监听方式是使用独立客户端:

var pg = require ('pg'),pgConnectionString = "postgres://user:pass@localhost/db";

var client = new pg.Client(pgConnectionString);
client.connect();
client.query('LISTEN "article_watcher"');
client.on('notification',function(data) {
    console.log(data.payload);
});

原文地址:https://www.jb51.cc/postgresql/191631.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐