Rails 3 DB连接池 - 连接未关闭

时间:2014-03-19 10:10:06

标签: ruby-on-rails postgresql

Stack是Rails 3 / Postgres + mongrel。我最近不得不增加连接池,因为其中一个杂种上的命中总是超时。我推断,每个运行3个mongrels + delayed_job,我需要在池中连接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应该自动关闭它的连接,但事实并非如此。

我是否正确阅读了这个?我在某个地方有泄漏吗?可能导致什么呢?

1 个答案:

答案 0 :(得分:2)

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

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