【发布时间】:2014-06-05 18:33:21
【问题描述】:
我们正在开发一个simple Rails 4 webapp,由 Heroku 托管并提供免费计划。
最近,我们遇到了一些ActiveRecord::ConnectionTimeoutError - 每隔几天就会出现一次 - 我们并不真正了解其背后的原因。
您可能想查看完整的堆栈here。
我们知道 Heroku 为 Postgres 数据库设置了 20 个连接的池限制,这很可能是引发异常的原因。这是我们的猜测:
我们使用 Herku 调度程序每小时启动一个 rake 任务,由于该任务查询数据库,问题可能在于这些连接在使用后没有从池中释放。所以我们试图把所有东西都放在一个块中:
ActiveRecord::Base.connection_pool.with_connection do
#code with queries
end
但这似乎并不能解决问题。你有更好的建议/解释吗?
非常感谢任何帮助和/或见解,以及我们应该如何调试此问题。
PS:我们也尝试在专用的初始化器中添加以下代码,但并没有解决问题
Rails.application.config.after_initialize do
ActiveRecord::Base.connection_pool.disconnect!
ActiveSupport.on_load(:active_record) do
config = ActiveRecord::Base.configurations[Rails.env] ||
Rails.application.config.database_configuration[Rails.env]
config['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 10 # seconds
config['pool'] = ENV['DB_POOL'] || 20
ActiveRecord::Base.establish_connection(config)
end
end
【问题讨论】:
-
你只有1个进程?请记住,如果您有伙伴或正在运行的东西,他们必须共享 20 个连接......
-
我们不使用 Sidekiq,但我们使用 Heroku 调度程序调用 rake,每小时一次。这需要很少的查询......这就是重点吗?
-
hm,取决于您的用户负载... rake 任务和错误同时发生?
-
用户负载并没有那么高——我们从来没有同时拥有 20 个用户。无论如何,由于“heroku 日志”问题,我无法获得错误的准确时间
-
尝试使用github.com/kch/rack-timeout。可能会有所帮助
标签: ruby-on-rails postgresql heroku