空闲PostgreSQL连接是否有超时?

use*_*451 79 postgresql database-connection

1 S postgres  5038   876  0  80   0 - 11962 sk_wai 09:57 ?        00:00:00 postgres: postgres my_app ::1(45035) idle                                                                                 
1 S postgres  9796   876  0  80   0 - 11964 sk_wai 11:01 ?        00:00:00 postgres: postgres my_app ::1(43084) idle             
Run Code Online (Sandbox Code Playgroud)

我看到了很多.我们正在尝试修复连接泄漏.但与此同时,我们希望为这些空闲连接设置超时,最长可达5分钟.

Cra*_*ger 106

听起来您的应用程序中存在连接泄漏,因为它无法关闭池连接.您只是遇到<idle> in transaction会话问题,但整体连接太多.

杀死连接不是正确的答案,但它是一个好的临时解决方法.

而不是重新启动PostgreSQL以从PostgreSQL数据库启动所有其他连接,请参阅:如何从postgres数据库中分离所有其他用户?如果有一个活动的连接,如何删除PostgreSQL数据库?.后者显示更好的查询.

要设置超时,如@Doon建议请参阅如何自动关闭PostgreSQL中的空闲连接?,建议您使用PgBouncer代理PostgreSQL并管理空闲连接.如果你有一个错误的应用程序泄漏连接,这是一个非常好的主意; 我强烈建议您配置PgBouncer.

一个TCP存活不会在这里做的工作,因为该应用程序仍处于连接状态,充满活力,它只是不应该.

在PostgreSQL 9.2及更高版本中,您可以使用新的state_changetimestamp列和state字段pg_stat_activity来实现空闲连接收割机.有一个cron工作运行这样的事情:

SELECT pg_terminate_backend(pid)
    FROM pg_stat_activity
    WHERE datname = 'regress'
      AND pid <> pg_backend_pid()
      AND state = 'idle'
      AND state_change < current_timestamp - INTERVAL '5' MINUTE;
Run Code Online (Sandbox Code Playgroud)

在旧版本中,您需要实现复杂的方案,以跟踪连接何时空闲.不打扰; 只需使用pgbouncer.

  • 很好,但它会杀死其他PgAdmin后端.使用附加条件application_name ='' (3认同)

sho*_*sti 57

在PostgreSQL 9.6中,有一个新选项idle_in_transaction_session_timeout可以完成你描述的内容.您可以使用SET命令设置它,例如:

SET SESSION idle_in_transaction_session_timeout = '5min';
Run Code Online (Sandbox Code Playgroud)

  • SET SESSION仅用于当前会话(一旦打开新连接,它将恢复为默认值)。您还可以使用“ ALTER DATABASE SET idle_in_transaction_session_timeout ='5min'”或使用配置文件在数据库级别上设置配置参数(请参阅https://www.postgresql.org/docs/current/static/config-setting.html )。 (4认同)
  • 或者您可以在 **postgresql.conf** 或通过 [alter system](https://www.postgresql.org/docs/current/sql-altersystem.html) 设置。很不错。 (2认同)

小智 20

在PostgreSQL 9.1中,空闲连接具有以下查询.它帮助我摆脱了重启数据库所需的情况.这主要发生在打开JDBC连接但未正确关闭的情况下.

SELECT
   pg_terminate_backend(procpid)
FROM
   pg_stat_activity
WHERE
   current_query = '<IDLE>'
AND
   now() - query_start > '00:10:00';
Run Code Online (Sandbox Code Playgroud)


小智 6

如果您使用的是PostgreSQL 9.6+,则可以在postgresql.conf中进行设置

idle_in_transaction_session_timeout = 30000 (毫秒)


rus*_*tyx 6

断开的连接会超时(即由于网络错误),这依赖于操作系统的 TCP keepalive 功能。默认情况下,在 Linux 上,断开的 TCP 连接会在约 2 小时后关闭(请参阅 参考资料sysctl net.ipv4.tcp_keepalive_time)。

idle_in_transaction_session_timeout放弃的事务和锁也有超时lock_timeout。建议将这些设置为postgresql.conf.

但正确建立的客户端连接没有超时。如果客户端想要保持连接打开,那么它应该能够无限期地这样做。如果客户端泄漏连接(例如打开越来越多的连接并且永不关闭),请修复客户端。不要尝试中止在服务器端正确建立的空闲连接。