我有一个使用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配置的更多信息.
我一直在调查我自己的应用程序中的类似问题,并发现这是一个有用的指南,如何连接工作:https://bibwild.wordpress.com/2014/07/17/activerecord-concurrency-in-rails4-avoid-leaked-connections/.虽然这里引用的代码可能需要一些调整,有一个很好的概述在那里如何去做检测何时创建隐式数据库连接.