1

我有一个导致 Postgres 连接泄漏的 Rails 多线程应用程序。最终,当我尝试建立新连接时,它告诉我我有太多客户。

当我查看当前连接时,我看到一堆具有以下状态的连接:“事务中的空闲(中止)”。这是什么意思,最重要的是,有没有办法让 Postgres 定期检查这些类型的连接,并在它们长时间存在时终止它们?

我知道解决此问题的最佳方法是修复应用程序问题,但除此之外,我如何确保这些类型的陈旧连接不会阻塞连接池?

4

2 回答 2

4

因此,一种半骇人听闻的方法是摆脱处于空闲状态(已中止)状态超过 5 分钟的进程。您可以将其放入 Cron 作业中:

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity 
WHERE datname = 'DBNAME'
  AND pid <> pg_backend_pid()
  AND state = 'idle in transaction (aborted)' 
  AND state_change < current_timestamp - INTERVAL '5' MINUTE

对于 postgres 版本 ≤ 9.1,您可能想试试这个:

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'DBNAME'
  AND procpid <> pg_backend_pid() 
  AND current_query = '<IDLE> in transaction (aborted)'
  AND query_start < current_timestamp - INTERVAL '5' MINUTE
于 2013-02-23T03:16:15.473 回答
4

对于问题的“这意味着什么”部分,我的回答是您的应用程序可能没有正确处理 SQL 错误:postgres 连接引发了应用程序无法检测到的错误并且不会回滚事务。所以连接永远保持“在事务中(中止)” 。

于 2015-04-23T08:54:35.843 回答