Postgres连接泄漏 - 在事务中空闲(中止)

时间:2013-02-23 02:43:54

标签: ruby-on-rails postgresql activerecord

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

当我查看当前连接时,我看到一堆具有此状态的连接:“在事务中空闲(已中止)”。这意味着什么,最重要的是有一种方法让Postgres定期检查这些类型的连接,并在它们长时间保留时终止它们?

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

2 个答案:

答案 0 :(得分:4)

因此,半hackish方式是摆脱状态(中止)状态超过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

答案 1 :(得分:1)

对于&#34;它是什么意思&#34;问题的一部分,我的答案是您的应用程序可能无法正确处理SQL错误:postgres连接引发错误,应用程序无法检测到并且不回滚事务。因此,连接仍然是&#34;在事务中(已中止)&#34; 永远。