ruby-on-rails - 如果数据库关闭,为什么准系统 Rails Controller 会阻塞?

标签 ruby-on-rails ruby

我有一个不依赖于数据库的简单 Rails Controller 。

class PingController < ActionController::Base
  def ping
    render text: 'The service is up'
  end
end

但是,当数据库出现故障时,此 Controller 操作会阻塞。 为什么会这样?

最佳答案

我认为可能有三个罪魁祸首。

一个新的 Rails 应用程序具有以下中间件 ( Source ):

use Rack::Sendfile
use ActionDispatch::Static
use Rack::Lock
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x000000029a0838>
use Rack::Runtime
use Rack::MethodOverride
use ActionDispatch::RequestId
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use ActionDispatch::DebugExceptions
use ActionDispatch::RemoteIp
use ActionDispatch::Reloader
use ActionDispatch::Callbacks
use ActiveRecord::Migration::CheckPending
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use ActionDispatch::ParamsParser
use Rack::Head
use Rack::ConditionalGet
use Rack::ETag
run Rails.application.routes

对您的 Controller 的每个请求基本上都依次通过链中的每个中间件。

其中三个与数据库相关,因此每个请求都依赖于数据库。您会注意到它们都是 ActiveRecord 的一部分,这是涉及数据库的重要提示。

  1. ActiveRecord::Migration::CheckPending

    这会在传递请求之前检查数据库中是否有待处理的迁移。据我所知,查看源代码它会检查所有环境中的待处理迁移。

  2. ActiveRecord::ConnectionAdapters::ConnectionManagement

    除测试环境外,此中间件每个请求都会清除事件的数据库连接。也许这个中间件中的数据库连接正在阻止您的 Controller 操作。

  3. ActiveRecord::QueryCache

    这也可能会阻止数据库请求。据我所知,它对所有环境都有效。

关于ruby-on-rails - 如果数据库关闭,为什么准系统 Rails Controller 会阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32597798/

相关文章:

ruby-on-rails - 没有迁移表的 Rails STI 模型

ruby-on-rails - Ruby on Rails 复选框不会在表单提交时更新

ruby - 在 Ruby 2.0.0p353(基于 rvm 的安装)下安装 Nokogiri 1.6.1 失败(OSX Mavericks)?

ruby-on-rails - 无法将不允许的参数转换为哈希 rails

ruby-on-rails - rails “Template is missing” 错误

ruby - 如何将数学运算(例如 +、-、*、/)作为参数传递给方法

ruby-on-rails - 使用 Faraday 和 Omniauth 进行 Rails 集成测试

ruby-on-rails - Rails 中的 Gitlab 密码重置

ruby-on-rails - 如何有条件地将类添加到 Rails 布局中的 <body>

ruby-on-rails - ruby on rails AbstractController::Helpers::MissingHelperError: 缺少帮助文件 helpers//