【发布时间】:2014-09-14 17:13:02
【问题描述】:
我有一个使用 NGINX 和 Puma 托管的 rails 应用程序。每隔 10 小时左右,该应用程序就会变得无法使用。每当用户尝试连接时,都会显示以下错误消息:
Error during failsafe response: could not obtain a database connection within 5.000 seconds (waited 5.000 seconds)
这会一直持续到应用重新启动。
我读到这是因为数据库连接池已满,因此必须在 rails 应用程序中创建线程,这些线程在完成时不会关闭它们与数据库的连接。 据我所知,应用程序代码中只有一处使用了线程:一个块使用了 Ruby Timeout 模块,但这并不访问数据库。
遵循本指南 https://devcenter.heroku.com/articles/concurrency-and-database-connections(我实际上并没有使用 Heroku) 我已使用以下配置文件将数据库连接池的大小设置为 5:
#config/initializers/database_connection.rb
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['MAX_THREADS'] || 5
ActiveRecord::Base.establish_connection(config)
end
结束
该网站使用 Rails 4.0.0 托管。我已经读到这实际上可能是 Rails 4.0.0 的问题,并且在以后的版本中已修复,但我不确定。 ConnectionTimeoutError on Heroku with Postgres
- 有什么方法可以监控连接池中的活动数据库连接数吗?这将使调试变得更加容易。
- 在 Rails 应用程序代码中使用 Timeout 模块是否可能导致此问题?
- 这可能是 Rails 4.0.0 的问题,而不是我的应用程序的问题吗?
rails 应用正在生产环境中运行。如果需要,我可以提供有关我的 Puma、NGINX 配置的更多信息。
【问题讨论】:
-
我在 4.1 应用程序上也看到了很多这样的问题,而我在 3.x 上从未见过,所以我认为问题并没有真正解决。
-
有人找到解决办法吗?我也在看这个。我有预感它与
airbrakegem 和/或在application_controller.rb中使用current_user相关联。其他任何人在使用 airbrake gem 或在 application_controller.rb 中使用 current_user 时遇到此错误? -
通过将我的开发服务器切换到 webrick 我没有看到这个错误。我认为罪魁祸首是美洲狮。
标签: ruby-on-rails nginx database-connection puma