ActiveRecord :: ConnectionTimeoutError偶尔发生

时间:2012-08-20 21:31:09

标签: ruby-on-rails activerecord ruby-on-rails-3.1 database-connection connection-timeout

每当我有一个使用ActiveRecord的应用程序时,我得到这个ConnectionTimeoutError - 但总是在一段未知的时间之后

ActiveRecord::ConnectionTimeoutError (could not obtain a database connection within 5 seconds.  The max pool size is currently 30; consider increasing it.):

之前设置为5,我们已经增加了它,并且它无法同时使用30个连接。我们唯一使用ActiveRecord的是会话商店。

我们的database.yml文件如下所示:

development:
  adapter: sqlite3
  database: db/development.sqlite3
  pool: 30
  timeout: 5000

(测试和生产设置相同)


我一直在谷歌搜索这个事件,刚刚发现了这个帖子:

https://groups.google.com/forum/#!msg/copenhagen-ruby-user-group/GEHgi_WudmM/gnCiwWqmVfMJ

哪个提到ActiveRecord一旦完成后就不会检查连接回池?真的吗?我是否需要手动管理连接?

我很感激任何建议!!

编辑我应该提一下我正在运行Rails 3.1.3

4 个答案:

答案 0 :(得分:12)

Rails有一个名为ActiveRecord::ConnectionAdapters::ConnectionManagement的中间件,它可以清除每个请求的活动连接,因此它们不会留下来。检查你的中间件以确保你有这个(默认情况下),运行“rake middleware”。您不必手动管理连接以回答上一个问题。

在您的控制台中运行

   ActiveRecord::Base.clear_active_connections!

答案 1 :(得分:1)

我在Sinatra应用程序上使用了这段代码

after do
  ActiveRecord::Base.clear_active_connections!
end   

这解决了我的问题

答案 2 :(得分:1)

  

也适用于Rails 5,因为Puma是默认服务器。

如果您使用像Puma,Phushion Passenger这样的Threaded Servers,它们会创建同一应用程序的多个线程。从而通过同时执行每个传入的请求,使您的应用程序运行得更快。

确保池大小等于或大于线程数。当我的线程很少给我ActiveRecord::ConnectionTimeoutError时,我遇到了一个问题,问题很模糊,因为它偶尔会发生一次。

答案 3 :(得分:1)

我还遇到了与Sinatra App类似的问题,我添加了

after do
  ActiveRecord::Base.clear_active_connections!
end 

到我的应用程序控制器,它解决了我的问题。

此构造称为过滤器,它在每次请求后进行评估。

我不确定应用程序实际发生了什么,但我怀疑在每次请求后都没有关闭连接。