我有一个导致 Postgres 连接泄漏的 Rails 多线程应用程序。最终,当我尝试建立新连接时,它告诉我我有太多客户。
当我查看当前连接时,我看到一堆具有以下状态的连接:“事务中的空闲(中止)”。这是什么意思,最重要的是,有没有办法让 Postgres 定期检查这些类型的连接,并在它们长时间存在时终止它们?
我知道解决此问题的最佳方法是修复应用程序问题,但除此之外,我如何确保这些类型的陈旧连接不会阻塞连接池?
我有一个导致 Postgres 连接泄漏的 Rails 多线程应用程序。最终,当我尝试建立新连接时,它告诉我我有太多客户。
当我查看当前连接时,我看到一堆具有以下状态的连接:“事务中的空闲(中止)”。这是什么意思,最重要的是,有没有办法让 Postgres 定期检查这些类型的连接,并在它们长时间存在时终止它们?
我知道解决此问题的最佳方法是修复应用程序问题,但除此之外,我如何确保这些类型的陈旧连接不会阻塞连接池?
因此,一种半骇人听闻的方法是摆脱处于空闲状态(已中止)状态超过 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
对于问题的“这意味着什么”部分,我的回答是您的应用程序可能没有正确处理 SQL 错误:postgres 连接引发了应用程序无法检测到的错误并且不会回滚事务。所以连接永远保持“在事务中(中止)” 。