与当没有会话已发出NOTIFY会发生什么监听PostgreSQL的?(What happens wi

2019-10-19 21:04发布

PostgreSQL有一个很好听/通知系统。 文件说:

有保存已发送但尚未被所有的监听会话处理通知的队列。 如果此队列已满,交易调用NOTIFY将会在提交失败。

但我不能找出在不具有听众指定通道的事件发生了什么。 将通知队列溢出或将PG下降,由队列这些事件?

Answer 1:

这可能是在手册中更清晰,但队列是尽快清理,因为没有会话正在积极等待通知明确指示。 每文档:

但是,如果会话执行任何清理可以发生LISTEN ,然后进入交易了很长一段时间。 一旦队列是半满的,你会看到指向你是防止清理会话的日志文件的警告。 在这种情况下,你应该确保本次会议结束其当前的事务,这样的清理可以继续进行。

这意味着,如果没有人接听(不活动会话已发出LISTEN在同一通道上的命令),从没有立即清理队列保持Postgres的。



Answer 2:

当已发出了交易NOTIFY提交的SQL引擎查找其他会话LISTEN 在这个时间点此通知。

如果没有,该通知被扔掉。 这不是任何地方排队。

它不是那样的直接解释LISTEN文件 ,但通过@IfLoop评论中指出,它是由一个严格的解释暗示:

...保存已发送但尚未被所有的监听会话处理通知的队列。

尚未被零会话装置处理没有什么排队。

此外,它是有道理的,因为否则每个通知应该担心是否有听众与否,这将严重阻碍的实用性NOTIFY



文章来源: What happens with a NOTIFY when no session has issued LISTEN in PostgreSQL?