PostgreSQL有一个很好听/通知系统。 文件说:
有保存已发送但尚未被所有的监听会话处理通知的队列。 如果此队列已满,交易调用NOTIFY将会在提交失败。
但我不能找出在不具有听众指定通道的事件发生了什么。 将通知队列溢出或将PG下降,由队列这些事件?
PostgreSQL有一个很好听/通知系统。 文件说:
有保存已发送但尚未被所有的监听会话处理通知的队列。 如果此队列已满,交易调用NOTIFY将会在提交失败。
但我不能找出在不具有听众指定通道的事件发生了什么。 将通知队列溢出或将PG下降,由队列这些事件?
这可能是在手册中更清晰,但队列是尽快清理,因为没有会话正在积极等待通知明确指示。 每文档:
但是,如果会话执行任何清理可以发生
LISTEN
,然后进入交易了很长一段时间。 一旦队列是半满的,你会看到指向你是防止清理会话的日志文件的警告。 在这种情况下,你应该确保本次会议结束其当前的事务,这样的清理可以继续进行。
这意味着,如果没有人接听(不活动会话已发出LISTEN
在同一通道上的命令),从没有立即清理队列保持Postgres的。
当已发出了交易NOTIFY
提交的SQL引擎查找其他会话LISTEN
在这个时间点此通知。
如果没有,该通知被扔掉。 这不是任何地方排队。
它不是那样的直接解释LISTEN文件 ,但通过@IfLoop评论中指出,它是由一个严格的解释暗示:
...保存已发送但尚未被所有的监听会话处理通知的队列。
尚未被零会话装置处理没有什么排队。
此外,它是有道理的,因为否则每个通知应该担心是否有听众与否,这将严重阻碍的实用性NOTIFY
。