繁体   English   中英

Rails 4数据库连接池错误

[英]Rails 4 database connection pool error

我有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的问题,并且在更高版本中已修复,但不确定。 使用Postgres在Heroku上的ConnectionTimeoutError

  1. 有什么方法可以监视连接池中活动数据库连接的数量? 这将使调试更加容易。
  2. 在Rails应用程序代码中使用超时模块是否可能导致此问题?
  3. 这可能是Rails 4.0.0的问题,而不是我的应用程序的问题吗?

Rails应用程序正在生产环境中运行。 如果需要,我可以提供有关Puma NGINX配置的更多信息。

故障安全响应试图分配数据库连接的事实可能是冒烟的人。 它可以帮助您描述故障安全响应中发生的情况。 可能是在原始请求触发异常时触发了故障安全响应。 在ConnectionManager调用clear_active_connections之后,将调用调用故障安全响应的rails show_exception例程! 对于当前请求(失败失败),这意味着在故障安全响应失败后,rails不会自动释放数据库连接。 这意味着故障安全响应处理程序负责清理自己的数据库连接。 我不确定故障安全响应处理程序尝试连接到数据库是否是一种好习惯,但是如果这是所需的行为,那么您可能必须调用clear_active_connections! 明确地在故障安全处理程序的末尾(在确保块中)。

我一直在研究自己的应用程序中的类似问题,并发现这对连接的工作方式很有帮助https : //bibwild.wordpress.com/2014/07/17/activerecord-concurrency-in-rails4-avoid -leaked-connections / 虽然此处引用的代码可能需要一些调整,但是其中有一个很好的概述,说明如何在创建隐式数据库连接时进行检测。

我认为这不是Rails 4.0.0的问题。

因此,如ruby超时模块文档中所述,它产生了一个新线程。 我认为有可能产生长时间运行的线程,使数据库连接保持活动状态。 要检查正在运行的线程,可以使用Thread.list方法。 还要记住,您的池大小必须> =大于puma线程乘以puma工人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM