【发布时间】:2020-06-05 23:14:37
【问题描述】:
我正在使用 Postgres 9.5,它有一个名为 LISTEN/NOTIFY 的功能,允许您设置异步命令通道以从服务器获取通知。在我的应用程序运行并测试通知的前 10 到 15 分钟内,一切似乎都正常,但经过一定时间后,消息似乎被丢弃了。
有人对什么可以防止这种行为有任何建议吗?这与保持活动/ tcp 保持活动设置有关吗?在 pg_state_activity 我看到了相同的连接并且它处于空闲状态。
一般情况
- 在 c# 中将 npgsql 库用于异地 Postgresql 服务器
- 使用长时间运行的连接(设置监听、等待)
- 执行查询以侦听传入的通知和通知
- 等待(使用取消令牌)直到收到消息(连接时没有其他活动发生)。
查看 StackOverflow 上的其他一些答案,似乎人们也将此归因于池化,尽管我不完全确定这是否能很好地转化为 npgsql,因为它会在连接/断开连接时汇集连接。
我很感激人们对此问题的任何见解,有人知道如何使我的情况发挥作用吗?这是罪魁祸首的代码:https://gist.github.com/phr34k/3a59af154d8ce6636dfc332271052a6a
编辑
针对jjanes的回复,我去进一步调查。当我查看pg_state_activity 时,它会列出处于空闲状态的连接。当我在服务器上用netstat -t 交叉引用客户端端口号时,至少我没有看到列出的连接。
公平地说,在我运行netstat -t 之前,我确实尝试了pg_notify,所以我还不确定运行pg_notify 是否不会导致它终止。然而,奇怪的是连接一直显示在pg_state_activity 中,好像 postgres 甚至没有意识到连接已关闭?
我认为这与防火墙和空闲连接有关。有人知道 ubuntu/digital ocean stack 中是否有任何默认设置会在一段时间后终止连接?
【问题讨论】:
标签: c# postgresql listen tcp-keepalive