Heroku上的ConnectionTimeoutError与Postgres

nat*_*nko 5 heroku ruby-on-rails-4 heroku-postgres

我在Heroku上部署了我的应用程序时出现问题.它在本地环境中工作正常,但是当部署到Heroku时,通常会出现应用程序错误.

日志中的例外是:ActiveRecord :: ConnectionTimeoutError(无法在5.000秒内获得数据库连接(等待5.000秒))

控制器和模型没什么特别的,相当简单的CRUD操作.

该应用程序使用Rails 4构建,它使用标准的heroku postgres数据库附加组件和WEBrick服务器.

我试过像这样设置配置:

#config/initializers/database_connection.rb
Rails.application.config.after_initialize do
  ActiveRecord::Base.connection_pool.disconnect!

  ActiveSupport.on_load(:active_record) do
    config = Rails.application.config.database_configuration[Rails.env]
    config['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 5 # seconds
    config['pool']              = ENV['DB_POOL']      || 10
    config['timeout']           = ENV['DB_TIMEOUT']   || 10
    ActiveRecord::Base.establish_connection(config)
  end
end
Run Code Online (Sandbox Code Playgroud)

但它没有帮助.

你知道什么可以提供帮助吗?

Sim*_*ton 5

您的数据库池不是问题.这是一个已知的rails问题.如果您使用的是Rails 4.0.2,那么声明就是在Gemfile中使用rails master.我也遇到了这个问题,但是我还没有尝试过这个解决方案.

  • 我在轨道4.1.1上,这个错误仍然没有明显的原因...... (6认同)
  • 谢谢你!我刚刚从4.0.3升级到4.0.4并解决了这个问题.留下我的另一个问题,但嘿. (3认同)
  • @Daniel显然最终将在Rails 4.2中修复,请参阅上面链接中的最后一条评论 (2认同)

Win*_*eld 2

您发布的代码示例是合法的。您的 Heroku 配置环境中可能存在某些问题。

您看到的错误表明您的DB_POOL值设置得太低。此错误表示应用程序服务器等待从池中检查连接时超时,不一定是连接失败。您是否有可能DB_POOL设置为 1 或较低的值?

您还应该验证数据库配置是否完整,是否具有默认数据库配置中的完整主机名、凭据和配置集。您可以在 Heroku 控制台中运行以下命令:

Rails.application.config.database_configuration[Rails.env]
Run Code Online (Sandbox Code Playgroud)

您的 Heroku 配置设置中有一些不正确的内容导致了此超时。