Rails 3数据库连接池-连接未关闭

3

Stack是Rails 3/Postgres + Mongrel。最近,我不得不增加连接池的大小,因为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应该自动关闭连接,但情况似乎并非如此。

我是否理解正确?我是否有漏洞?可能是什么原因导致了这种情况?


你是否正在使用类似于Sidekiq/Delayed Job或在不同的线程中使用ActiveRecord? - Slicedpan
我们确实有一个延迟作业正在运行,但是使用三个Mongrel,我希望会有3倍的连接数(每个实例一个),再加上3倍的连接数(每个延迟作业一个),总共应该只有6个活动连接,而不是20多个。 - Mikey Hogarth
1个回答

2
在控制器之外使用ActiveRecord事务,例如在延迟作业中,您必须使用以下语法来确保连接返回到池中。
ActiveRecord::Base.connection_pool.with_connection do
  #your code here
end

如果真是这样的话,那就相当令人不安了,而且也可以解释为什么会发生这种情况。你知道有什么来源证实了这一点吗(我在文档中找不到任何提及)?我们正在使用Rails 3.2.2。 - Mikey Hogarth
我在这里阅读了相关信息(https://github.com/brandonhilkert/sucker_punch)。通常情况下,你不需要这样做的原因是ActionController会自动执行从池中获取连接和返回连接的操作。 - Slicedpan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接