我有一个使用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的问题,而且这在后来的版本中已得到修复,但我不确定。
在Heroku上使用Postgres出现ConnectionTimeoutError- 有没有办法监视连接池中活动数据库连接的数量?这将使调试更加容易。
- 在Rails应用程序代码中使用Timeout模块是否可能导致此问题?
- 这可能是Rails 4.0.0的问题,而不是我的应用程序的问题吗?
rails应用正在生产环境中运行。如果需要,我可以提供有关我的Puma、NGINX配置的更多信息。
airbrake
gem和/或在application_controller.rb
中使用current_user
有关。还有其他人使用airbrake gem或在application_controller.rb中使用current_user遇到此错误吗? - Catfish