我有一个由NGINX和Puma托管的rails应用程序。每10个小时左右,该应用程序就无法使用。每当用户尝试连接时,都会显示以下错误消息:
Error during failsafe response: could not obtain a database connection within 5.000 seconds (waited 5.000 seconds)这种情况一直持续到应用程序重新启动为止。
我读过,这是因为数据库连接池已经满了,所以必须在rails应用程序中创建线程,当线程完成时不会关闭到数据库的连接。据我所知,在应用程序代码中只有一个地方可以使用线程:一个块使用Ruby超时模块,但这不能访问数据库。
按照本指南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上的ConnectionTimeoutError与Postgres
rails应用程序正在生产环境中运行。如果需要,我可以提供更多关于我的Puma,NGINX配置的信息。
发布于 2014-11-22 01:04:53
故障安全响应试图分配数据库连接这一事实可能是一个冒烟的问题。它可以帮助您描述故障安全响应中发生的情况。当原始请求触发异常时,可能会触发故障安全响应。调用故障安全响应的rails show_exception例程在ConnectionManager调用clear_active_connections之后调用!对于当前请求(异常失败),这意味着rails不会在故障安全响应失败后自动释放数据库连接。这意味着故障安全响应处理程序负责清理自己的数据库连接。我不确定故障安全响应处理程序是否可以尝试连接到数据库,但如果这是所需的行为,那么您可能必须调用clear_active_connections!显式地在故障安全处理程序的末尾(在一个确保块中)。
在我自己的应用程序中,我一直在研究一个类似的问题,并发现这是一个关于连接如何工作的有用指南:https://bibwild.wordpress.com/2014/07/17/activerecord-concurrency-in-rails4-avoid-leaked-connections/。虽然这里引用的代码可能需要一些调整,但其中有一个很好的大纲,说明了如何在创建隐式数据库连接时进行检测。
发布于 2014-11-02 20:00:26
我不认为这是rails 4.0.0问题。
因此,正如在ruby超时模块文档中提到的,它生成了一个新线程。我认为它有可能产生长时间运行的线程,使db连接处于动态状态。要检查正在运行的线程,可以使用Thread.list方法。还请记住,您的池大小必须是>=,而不是美洲狮线程乘美洲狮工作人员。
https://stackoverflow.com/questions/24911838
复制相似问题