私は3つの犯人があると思います。
新鮮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
コントローラーへの各要求は、本質的に鎖にこれらのミドルウェアのそれぞれ、次々に通過します。これらの
3つのデータベースに関連しているので、リクエストごとにデータベースに依存します。あなたは彼らがすべての部分であることに気付くでしょうActiveRecord
これは、データベースが関与する大きなヒントです。
ActiveRecord::Migration::CheckPending
、データベース内の保留中のマイグレーションが通過要求を渡す前にある場合、これがチェックされます。ソースコードを見ればわかるように、のの保留中の移行をチェックします。テスト環境を除き
ActiveRecord::ConnectionAdapters::ConnectionManagement
、このミドルウェアは、各要求アクティブDB接続をパージします。おそらく、このミドルウェアのデータベース接続がコントローラの動作をブロックしている可能性があります。
ActiveRecord::QueryCache
これは、データベース要求をブロックすることができます。私はそれがすべての環境に対して有効であると私は理解しています。
IMOこれは、ご使用の環境によって異なります。あなたはどのようなサーバーを使用していますか?あなたは '開発'または '生産'環境にいますか?この動作をテストするとき、またはサーバが起動したか、またはより長い時間アイドル状態になったときに、サーバはしばらくの間実行されていますか? – spickermann
あなたのミドルウェアを調べることをお勧めします。そのうちの1つは、データベースとの間で入出力のブロッキングを簡単に使用する可能性があります。ここにミドルウェアスタックを投稿してください。 – mudasobwa
「ブロックする」とはどういう意味ですか?何か間違いがありますか? – AJFaraday