有空闲的PostgreSQL连接超时吗?

前端之家收集整理的这篇文章主要介绍了有空闲的PostgreSQL连接超时吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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

我看到很多他们。我们正在努力修复我们的连接泄漏。但同时,我们要为这些空闲连接设置超时,也许最多为5分钟。

听起来你的应用程序有一个连接泄漏,因为它无法关闭池连接。您没有遇到问题,只需使用< idle>在事务会话中,但总体连接太多。

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

而不是重新启动Postgresql以从一个Postgresql数据库引导所有其他连接,请参阅:How do I detach all other users from a postgres database?How to drop a PostgreSQL database if there are active connections to it?。后者显示更好的查询

对于设置超时,如@Doon建议看到Is it possible to configure PostgreSQL to automatically close idle connections?,建议您使用PgBouncer代理Postgresql和管理空闲连接。这是一个很好的主意,如果你有一个buggy应用程序泄漏连接;我强烈建议配置PgBouncer。

一个TCP keepalive不会在这里做的工作,因为应用程序仍然连接和活着,它只是不应该。

在Postgresql 9.2及以上版本中,您可以使用新的state_change时间戳列和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;

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

猜你在找的Postgre SQL相关文章