22

每当我有一个使用 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

4 回答 4

13

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

在您的控制台中运行它

   ActiveRecord::Base.clear_active_connections!
于 2012-08-22T22:31:31.837 回答
2

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

after do
  ActiveRecord::Base.clear_active_connections!
end   

这解决了我的问题

于 2014-05-13T14:32:55.240 回答
2

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

如果您使用 Puma、Phushion Passenger 等线程服务器,它们会为同一个应用程序创建多个线程。通过同时执行每个传入的请求,从而使您的应用程序运行得更快。

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

于 2016-02-06T12:33:12.587 回答
2

我在使用 Sinatra 应用程序时也遇到了类似的问题,我补充说

after do
  ActiveRecord::Base.clear_active_connections!
end 

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

这种结构称为过滤器,它在每次请求后进行评估。

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

于 2017-01-17T19:03:27.577 回答