Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Postgres连接泄漏-事务中空闲(中止)_Ruby On Rails_Postgresql_Activerecord - Fatal编程技术网

Ruby on rails Postgres连接泄漏-事务中空闲(中止)

Ruby on rails Postgres连接泄漏-事务中空闲(中止),ruby-on-rails,postgresql,activerecord,Ruby On Rails,Postgresql,Activerecord,我有一个Rails多线程应用程序,导致Postgres连接泄漏。最终,当我尝试建立一个新的连接时,它告诉我我有太多的客户 当我查看当前的连接时,我看到一组具有以下状态的连接:“事务中空闲(中止)”。这意味着什么?最重要的是,有没有办法让博士后定期检查这些类型的连接,如果它们长时间存在,就终止它们 我知道解决这一问题的最佳方法是解决应用程序问题,但除此之外,我如何确保这些类型的陈旧连接不会阻塞连接池?因此,一种半黑客方法是清除空闲状态(中止)超过5分钟的进程。您可以将其放入Cron作业中: SEL

我有一个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
选择pg\u终止\u后端(pid)
来自pg_统计_活动
其中datname='DBNAME'
和pid pg_backend_pid()
和状态='idle in transaction(中止)'
和状态变化<当前时间戳-间隔“5”分钟
博士后版≤ 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
选择pg\u终止\u后端(pid)
来自pg_统计_活动
其中datname='DBNAME'
和procpid pg_backend_pid()
当前_查询='事务中(已中止)'
和查询开始<当前时间戳-间隔“5”分钟

因此,一种半黑客方式是清除空闲状态(中止)超过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
选择pg\u终止\u后端(pid)
来自pg_统计_活动
其中datname='DBNAME'
和pid pg_backend_pid()
和状态='idle in transaction(中止)'
和状态变化<当前时间戳-间隔“5”分钟
博士后版≤ 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
选择pg\u终止\u后端(pid)
来自pg_统计_活动
其中datname='DBNAME'
和procpid pg_backend_pid()
当前_查询='事务中(已中止)'
和查询开始<当前时间戳-间隔“5”分钟
对于问题的“它意味着什么”部分,我的回答是,您的应用程序可能没有正确处理SQL错误:postgres连接会引发一个错误,应用程序无法检测到该错误,并且不会回滚事务。因此,连接将永远保持“事务中(中止)”。

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