【问题标题】:ActiveRecord::ConnectionTimeoutError happening sporadicallyActiveRecord::ConnectionTimeoutError 偶尔发生
【发布时间】:2012-08-20 21:31:08
【问题描述】:

每当我有一个使用 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 在完成连接后不会将连接检查回池中?真的吗?我需要手动管理连接吗?

感谢任何建议!

edit我应该提到我正在运行 Rails 3.1.3

【问题讨论】:

  • 您的 sqlite gem 是否良好且是最新的? sqlite 文件是否具有良好的权限?
  • 在您的终端中运行“rake 中间件”并查找 ActiveRecord::ConnectionAdapters::ConnectionManagement
  • @KyleC - 请在下面查看我对您帖子的评论。 @quatermain - 我们的 Gemfile(与 sqlite 和数据库相关)中的 gem 是 activerecord-jdbc-adapter using version 1.2.2activerecord-jdbcsqlite3-adapter using version 1.2.2jdbc-sqlite3 using version 3.7.2
  • 老实说,我是在使用这些 Gems 创建 Gemfile 之后进入这个项目的 - 我们是否可能不需要所有这 3 个?

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


【解决方案1】:

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

在您的控制台中运行它

   ActiveRecord::Base.clear_active_connections!

【讨论】:

  • 我以为您的意思是运行“rake 中间件”?正如你上面的评论所说的那样?这是 rake 中间件命令的输出: note ActiveRecord::ConnectionAdapters::ConnectionManagement 已列出。 ... use ActionDispatch::Reloader use ActionDispatch::Callbacks **use ActiveRecord::ConnectionAdapters::ConnectionManagement** use ActiveRecord::QueryCache use ActionDispatch::Cookies use ActiveRecord::SessionStore
  • 抱歉,评论中的输出有点乱,而且太长了,所以我从输出的开头和结尾删除了一些内容 - 但我的观点是 ActiveRecord::ConnectionAdapters: :ConnectionManagement 已列出 :)
  • 在您的控制台中,尝试运行 ActiveRecord::Base.clear_active_connections!
  • 是的!这样做的结果是我在寻找什么?这是我需要添加到类似 after_filter 的东西吗?这是我在网上找到的建议,但实际上我是在自己管理连接(无论如何,至少我是手动清除它们)
  • 这只是您想立即清除连接的答案 - 它不会阻止它再次发生。
【解决方案2】:

我在我的 Sinatra 应用上使用了此代码

after do
  ActiveRecord::Base.clear_active_connections!
end   

这解决了我的问题

【讨论】:

  • 你把这个放在哪里?在您的应用程序控制器中?
【解决方案3】:

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

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

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

【讨论】:

  • 这对我有用。在使用 Puma 时,我一直在使用默认池数(即 5)运行我的 rails 应用程序。
【解决方案4】:

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

after do
  ActiveRecord::Base.clear_active_connections!
end 

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-14
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 2011-03-09
    • 2013-10-31
    相关资源
    最近更新 更多