今天早上,我们的一位客户遇到了几个工作站的网络故障。我很惊讶,数据库服务器上的连接(和相关进程)仍然活跃了几分钟。不幸的是,我们的客户端应用程序设计得不太好,同时打开了多个数据库连接。这导致服务器上的连接总数翻倍,而内存压力已经很高了。
这是由设计决定的吗?如果客户端连接断开,是否有服务器参数强制关闭相关进程?此行为很容易重现,但要在连接到服务器时拔掉客户端工作站上的网线。
我不确定是什么最终导致这些连接自动关闭,但这花费了太长时间。
答案1
网络连接完全是虚拟的。它们由网络命令建立,由网络命令结束,并通过定期发送数据包保持活动状态。在任何时候,都没有物理连接可以让服务器立即检测到连接已丢失。它只能决定等待X秒数必须足以宣告连接终止。
所以,是的,这个等待时间很大程度上是设计好的,但你可以用tcp_keepalives_*
PostgreSQL 服务器配置中的选项。
答案2
这是设计使然。可能发生的情况是,您启动了一个锁定表的事务或查询。您需要做的是随机检查该连接是否失败、是否空闲超过一天等。
使用活着或者在您的应用程序中应用相同的逻辑。
最后,不推荐的方法是,你可以通过以下方式找到连接,
SELECT * FROM pg_stat_activity;
并杀死他们