C# Postgres c侦听超时

C# Postgres c侦听超时,c#,postgresql,listen,tcp-keepalive,C#,Postgresql,Listen,Tcp Keepalive,我使用的是Postgres9.5,它有一个名为LISTEN/NOTIFY的功能,允许您设置一个异步命令通道来从服务器获取通知。在我的应用程序运行并测试通知的最初10-15分钟内,一切似乎都正常,但在一定时间后,消息似乎会被删除 有人对如何防止这种行为有什么建议吗?这是否与保持活动/tcp保持活动设置有关?在pg_状态_活动中,我看到了相同的连接,它处于空闲状态 形势的总体概述 将c中的npgsql库用于非现场Postgresql服务器 使用长时间运行的连接设置侦听,等待 执行查询以侦听传入的通知

我使用的是Postgres9.5,它有一个名为LISTEN/NOTIFY的功能,允许您设置一个异步命令通道来从服务器获取通知。在我的应用程序运行并测试通知的最初10-15分钟内,一切似乎都正常,但在一定时间后,消息似乎会被删除

有人对如何防止这种行为有什么建议吗?这是否与保持活动/tcp保持活动设置有关?在pg_状态_活动中,我看到了相同的连接,它处于空闲状态

形势的总体概述

将c中的npgsql库用于非现场Postgresql服务器 使用长时间运行的连接设置侦听,等待 执行查询以侦听传入的通知和通知 使用取消令牌等待,直到收到消息为止,连接上不会发生其他活动。 通过查看有关StackOverflow的其他一些答案,人们似乎也将其归因于池,尽管我不完全确定这是否能很好地转化为npgsql,因为它在连接/断开连接时池连接

我会很感激人们对这个问题的任何见解,有人知道我如何才能使我的情况发挥作用吗?这里有一段代码是罪魁祸首:

编辑

为了回应简的回答,我去了进一步的调查。当我查看pg_state_活动时,它会列出处于空闲状态的连接。当我在服务器上用netstat-t交叉引用客户端端口号时,至少我看不到列出的连接

公平地说,在运行netstat-t之前,我确实尝试了一个pgu通知,所以我还不能确定运行pgu通知是否没有导致它终止。然而,奇怪的是,连接一直出现在pg_state_活动中,好像postgres甚至没有意识到连接已经关闭


我认为这与防火墙和空闲连接有关。有人知道ubuntu/digital ocean stack中是否有任何默认设置会在一段时间后终止连接吗?

我不认为任何东西会使连接停止侦听,而不会调用UNLISTEN或closing。最有可能的解释是连接被切断,然后连接池通过重新建立连接来解决这个问题,在这种情况下,新连接将不会侦听。应该在客户端和服务器端记录此事件。你在日志中看到了在这种情况下有意义的东西吗

“空闲”是pg_stat_活动中的正常状态,它什么都不做,只是在听,所以这对你没有帮助。但是backend_start列可能会有所帮助,这与正在关闭和重新打开的连接一致吗?state_更改起初看起来很有希望,但这似乎不仅仅是在客户端读取通知时更新的。我不认为一个会话可以检测是否有其他会话正在侦听。pg_侦听_频道仅适用于发出它的连接

使用取消令牌等待,直到收到消息为止,连接上不会发生其他活动

取消令牌是否重要?你用过吗?是否可以共享实现此等待的代码片段


我认为10或15分钟的时间不足以让TCP判断连接是否已断开,因此,如果连接正在断开,则更有可能是某个活动正在进行,如防火墙。如果是这样的话,它可能会看穿“保持活动”,并决定无论如何都要断开连接。

这是我检查pg_stat_活动的罪犯,我一眼就没发现任何可疑的东西;连接处于空闲状态,因此我手动尝试从pgAdmin发送通知,但没有收到任何消息;我还尝试在该状态下终止连接,但该状态也未被拾取。我在连接中启用了TCP KeepAlive。取消令牌并不重要,我基本上使用该令牌,以便在将其移动到服务组件启动/停止事件中时可以安全地关闭代码。但是,我只做了一次等待/侦听,在超时后不定期重新进入-我不确定这是否会使我的代码对这种分离问题更加敏感。我不明白您是如何防止您提到的行为的。我也遇到了这个问题。我使用Tcp Keepalive Time=val1和Tcp Keepalive Interval=val2来设置定义两个连续通知之间最大间隔的时间。在此时间间隔之后不会收到任何通知。