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 Rails 3 DB连接池-连接未关闭_Ruby On Rails_Postgresql - Fatal编程技术网

Ruby on rails Rails 3 DB连接池-连接未关闭

Ruby on rails Rails 3 DB连接池-连接未关闭,ruby-on-rails,postgresql,Ruby On Rails,Postgresql,堆栈是Rails 3/Postgres+mongrel。我最近不得不增加连接池,因为对其中一个混血儿的点击总是超时。我推断,如果每个服务器上运行3个Mongrel+一个延迟的_作业,则池中需要6个连接,而设置为5。我在database.yml中将其增加到10,解决了超时问题,不过现在当我在PG中监视连接时,我看到了这种情况 SELECT datname,usename,procpid,client_addr,waiting,query_start,current_query FROM pg_st

堆栈是Rails 3/Postgres+mongrel。我最近不得不增加连接池,因为对其中一个混血儿的点击总是超时。我推断,如果每个服务器上运行3个Mongrel+一个延迟的_作业,则池中需要6个连接,而设置为5。我在database.yml中将其增加到10,解决了超时问题,不过现在当我在PG中监视连接时,我看到了这种情况

SELECT datname,usename,procpid,client_addr,waiting,query_start,current_query FROM pg_stat_activity;


db1   | www-data |    8658 |             | f       | 2014-03-19 10:03:54.084825+00 | <IDLE>
db1   | www-data |    9071 |             | f       | 2014-03-19 09:58:42.306558+00 | <IDLE>
db1   | www-data |    8721 |             | f       | 2014-03-19 10:03:53.980691+00 | <IDLE>
db1   | www-data |    8722 |             | f       | 2014-03-19 10:03:53.874443+00 | <IDLE>
db1   | www-data |    8733 |             | f       | 2014-03-19 10:04:20.380137+00 | <IDLE>
db1   | www-data |    9080 |             | f       | 2014-03-19 10:00:54.157541+00 | <IDLE>
db1   | www-data |   10843 |             | f       | 2014-03-19 10:04:18.506355+00 | <IDLE>
#and so on and so on for more than 20 instances...
它屏蔽了多达20多个连接,并且似乎没有关闭它们。我假设,存在的仍然意味着它们是开放的,只是什么也不做。它看起来确实在上下波动,所以一些连接正在关闭

我以为rails/activerecord应该自动关闭连接,但事实似乎并非如此


我读对了吗?我在什么地方漏过水吗?可能是什么原因造成的?

在控制器启动的操作之外使用ActiveRecord事务时,例如在延迟作业中,必须使用以下语法以确保连接返回到池

ActiveRecord::Base.connection_pool.with_connection do
  #your code here
end

你是在使用sidekiq/delayed job之类的东西,还是在另一个线程中使用activerecord?我们确实有一个delayed_job,但是有三个混血儿,我希望每个实例有3个连接,每个delayed_job有3个连接,总共有6个活动连接,而不是20多个,如果是这样的话,那就相当令人不安了,并能解释为什么会这样。你知道的某个地方有没有消息来源证实了这一点,我在文档中找不到任何提及的地方——我们使用的是rails 3.2.2我读到过。通常不需要这样做的原因是,从池中获取连接并返回它们是由ActionController自动执行的