客户端应用程序在 10 分钟不活动后与其连接的数据库断开连接

joa*_*olo 5 postgresql client pgadmin network connectivity

当使用 pgAdmin 4(实际上是其他几个充当数据库客户端的程序)时,与服务器的连接在闲置 10 或 15 分钟后断开。一杯咖啡和一个电话,您会收到一条类似于“抱歉,与数据库的连接已丢失。您希望我尝试重新连接吗?”的消息。

而且pgAdmin重新连接总是需要多次尝试,并且已经展开的对象树被折叠了......所以,这有点烦人。

pgAdmin 似乎没有与该行为相关的任何参数。(似乎有一些方法可以更改某些连接超时,但它们与 pgAdmin 在服务器连接时间过长时的行为方式有关)。

可以做些什么来避免 pgAdmin 与数据库断开连接?


披露:这实际上是一个“伪问题”。它是另一个的衍生产品,最终与失去连接无关......鉴于我已经有了一个答案,我(不是很谦虚地)认为值得“问”,以防万一回答对某人有帮助。

joa*_*olo 5

pgAdmin 每隔 10 分钟左右就会抛出一个连接超时。

我认为问题可能与pgAdmin 客户端和 PostgreSQL 服务器之间路由器(或在某些情况下,有状态防火墙)有关。

当您在家(或在办公室)并且您的路由器正在执行 NAT(网络地址转换)时,这很常见。经过一段空闲时间后,连接被路由器关闭。这不是 pgAdmin 或 PostgreSQL 所做的事情,这取决于路由器上的设置,

如果是这种情况,您有三个选择:

  1. 如果可行并且您有适当的文档,请更改路由器中connection_timeout设置。以下是 Cisco 路由器的示例。

  2. 让路由器相信连接永远不会空闲足够长的时间。要做到这一点:更改一个服务器参数,称为tcp_keep_alives

根据关于 ConnectionsPostgreSQL 文档

tcp_keepalives_idle(整数)

指定 TCP 应向客户端发送 keepalive 消息之前的非活动秒数。值 0 使用系统默认值。此参数仅在支持 TCP_KEEPIDLE 或 TCP_KEEPALIVE 符号的系统和 Windows 上受支持;在其他系统上,它必须为零。在通过 Unix 域套接字连接的会话中,此参数被忽略并始终读取为零。

keepalive 消息应该避免 NAT 连接开始被丢弃。

请记住文档中的注释:

此参数仅在支持 TCP_KEEPIDLE 或 TCP_KEEPALIVE 符号的系统上以及 Windows 上受支持

我真的不知道哪些系统“支持 TCP_KEEPIDLE 或 TCP_KEEPALIVE 符号”,但我猜 Linux 和 Mac应该支持它们,根据文档,Windows 也是如此。

如果您的系统每 10 分钟断开一次连接,则将此设置设为大约 9 * 60 = 540 秒或更短应该是明智之举。

此设置应postgresql.conf在您的服务器上完成。您还可以使用以下命令在服务器中进行更改之前进行测试:

SET tcp_keepalives_idle = 480 ;
Run Code Online (Sandbox Code Playgroud)

这会改变您当前连接的设置,或

ALTER ROLE (the-one-you-use) tcp_keepalives_idle = 480 ;
Run Code Online (Sandbox Code Playgroud)

这只会更改此角色的设置。

  1. 更改客户端上的 keep_alives 。您不需要更改任何 connection_timeout(该参数是“在决定对方没有响应之前等待连接的时间有多长)。按照任何方式在 pgAdmin 中保持连接活动而无需设置的已接受答案的说明它在服务器上?。它的完美解释。

关于 keep-alives 的参考:此视频讨论了如何保持 SSH 会话活动。虽然这不是完全相同的场景,但它是等效的(用 pgAdmin 代替 SSH)。