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.
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)
小智 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 (毫秒)
断开的连接会超时(即由于网络错误),这依赖于操作系统的 TCP keepalive 功能。默认情况下,在 Linux 上,断开的 TCP 连接会在约 2 小时后关闭(请参阅 参考资料sysctl net.ipv4.tcp_keepalive_time)。
idle_in_transaction_session_timeout放弃的事务和锁也有超时lock_timeout。建议将这些设置为postgresql.conf.
但正确建立的客户端连接没有超时。如果客户端想要保持连接打开,那么它应该能够无限期地这样做。如果客户端泄漏连接(例如打开越来越多的连接并且永不关闭),请修复客户端。不要尝试中止在服务器端正确建立的空闲连接。
| 归档时间: |
|
| 查看次数: |
141336 次 |
| 最近记录: |