首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails 4数据库连接池错误

Rails 4数据库连接池错误
EN

Stack Overflow用户
提问于 2014-07-23 13:30:03
回答 2查看 3.2K关注 0票数 9

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

代码语言:javascript
运行
复制
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,配置文件如下:

代码语言:javascript
运行
复制
#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

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

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

EN

回答 2

Stack Overflow用户

发布于 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/。虽然这里引用的代码可能需要一些调整,但其中有一个很好的大纲,说明了如何在创建隐式数据库连接时进行检测。

票数 2
EN

Stack Overflow用户

发布于 2014-11-02 20:00:26

我不认为这是rails 4.0.0问题。

因此,正如在ruby超时模块文档中提到的,它生成了一个新线程。我认为它有可能产生长时间运行的线程,使db连接处于动态状态。要检查正在运行的线程,可以使用Thread.list方法。还请记住,您的池大小必须是>=,而不是美洲狮线程乘美洲狮工作人员。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24911838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档