gpt4 book ai didi

ruby-on-rails - Rails 4 数据库连接池错误

转载 作者:行者123 更新时间:2023-12-04 08:48:47 25 4
gpt4 key购买 nike

我有一个由 NGINX 和 Puma 托管的 Rails 应用程序。每隔 10 小时左右,该应用程序就会变得无法使用。每当用户尝试连接时,都会显示以下错误消息:

Error during failsafe response: could not obtain a database connection within 5.000 seconds (waited 5.000 seconds)

这种情况一直持续到应用程序重新启动。

我已经读过这是因为数据库连接池已满,因此必须在 rails 应用程序中创建线程,这些线程在完成时不会关闭它们与数据库的连接。
据我所知,应用程序代码中只有一处使用了线程:一个 block 使用了 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 配置的更多信息。

    最佳答案

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

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

    关于ruby-on-rails - Rails 4 数据库连接池错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24911838/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com