ruby-on-rails – 为什么准系统Rails控制器阻塞数据库是否关闭?

我有一个简单的Rails控制器,它不依赖于数据库.
class PingController < ActionController::Base
  def ping
    render text: 'The service is up'
  end
end

但是,当数据库关闭时,此控制器动作阻止.
为什么会发生这种情况?

解决方法

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

一个新的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

对你的控制器的每一个要求基本上都是通过链中的每个这些中间件,一个一个地传递出来.

其中三个与数据库相关,因此依赖于每个请求的数据库.你会注意到它们都是ActiveRecord的一部分,这是数据库涉及到的一个很大的缺点.

> ActiveRecord :: Migration :: CheckPending

这将在通过请求之前检查数据库中是否有挂起的迁移.从我可以看到源代码,它检查所有环境中的待处理迁移.
> ActiveRecord :: ConnectionAdapters :: ConnectionManagement

除了在测试环境中,这个中间件清除每个请求的活动数据库连接.也许这个中间件中的数据库连接可能会阻止您的控制器操作.
> ActiveRecord :: QueryCache

这也可能是阻止数据库请求.对于所有环境,我可以告诉我们.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...