在Heroku上使用Postgres时出现连接超时错误

5
我在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

但是这并没有帮上忙。

你有什么想法可以帮助吗?

2个回答

5

你的数据库连接池不是问题所在。这是一个已知的Rails问题。如果你正在使用Rails 4.0.2,则建议在你的Gemfile中使用rails master。我也遇到过这个问题,但我还没有尝试过这个解决方法。


3
谢谢这个!我刚从4.0.3升级到4.0.4,问题得到了解决。但又遇到了一个问题,不过没关系。 - Evolve
我的次要错误是“NoMethodError: undefined method `environment' for nil:NilClass”,这导致Heroku无法部署。我将sass-rails从4.0.1升级到4.0.3,解决了这个次要问题。 - Evolve
2
@Daniel,显然这个问题将在Rails 4.2中得到解决,请参见上面链接中的最后一条评论。 - Mike Szyndel

2
您发布的代码示例是合法的。您在Heroku配置环境中可能遇到了一些问题。
您看到的错误表明您的DB_POOL值设置得太低了。此错误指示应用程序服务器在等待从池中检查连接时发生超时,而不一定是连接失败。您的DB_POOL是否设置为1或较低值?
您还应验证您的数据库配置是否完整,是否具有来自默认数据库配置的完整主机名、凭据和配置设置。您可以在Heroku控制台中运行以下命令:
Rails.application.config.database_configuration[Rails.env]

你的Heroku配置设置中有错误,导致了此超时问题。


谢谢你的回答!我会去查看它。 - nataliastanko
我在 config/database.yml 中增加了值,这对我解决了问题。我认为默认值是5,但在Heroku上,最大池取决于所提供的数据库和层级。 - whodini9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接