我在PostgreSQL9.1数据库上有一个“文章”表和一个在每次插入时通知通道的触发器。
我想创建一个node.js脚本来捕获这些插入,并使用Socket.io将通知推送到连接的客户端。到目前为止,我使用node-postgres模块来监听通道,但是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);
});
});如何确保完整的侦听,或者如何捕获这些超时以重新发出侦听查询?或者,node-postgres之外的其他模块提供了更合适的工具来实现这一点?
发布于 2011-11-27 01:35:40
我得到了我关于node-postgres repo的问题的答案。引用Brianc的话:
pg.connect用于创建池化连接。使用连接池连接侦听事件确实是不受支持的,但这是一个好主意。..。要“监听”,根据定义,连接必须保持永久打开。对于永久保持打开的连接,它永远不能返回到连接池。
在这种情况下,正确的监听方式是使用独立的客户端:
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);
});发布于 2011-11-25 04:59:32
LISTEN应该在会话生存期内持续,或者一直持续到您执行UNLISTEN。因此,只要您的代码正在运行,就应该发送通知。请注意,IIRC,postgresql没有承诺为每个NOTIFY提供一个通知--如果您有多个NOTIFY,它可能会选择提供一个单独的insert。由于不确定9.1,他们引入了LISTEN有效负载,因此它可能没有什么意义。
发布于 2021-08-20 21:31:35
pg-promise中的永久连接是
db.connect({direct: true})
.then(...)
.catch(...);https://stackoverflow.com/questions/8262375
复制相似问题