古いコンテンツを提供している Rails 3.2 アプリがあります。典型的なシナリオ:
- 管理者がバックエンドにいくつかの新しいレコードを追加します
- ユーザーはそれらのリソースのインデックス ページを表示します
- それらはページに表示されません
- 彼らはリフレッシュします。リソースは今そこにあります
- 彼らはリフレッシュします。リソースはそこにありません
- 等
これをテストできるように、モデル/コントローラー/ビューを作成しました。
# app/models/cache_query_test.rb
class CacheQueryTest < ActiveRecord::Base
end
# app/controllers/cache_query_tests_controller.rb
class CacheQueryTestsController < ApplicationController
def count
@count = CacheQueryTest.count
@mysql_time = CacheQueryTest.find_by_sql("SELECT NOW() AS mysql_time")
respond_to do |wants|
wants.text { render :layout => false }
end
end
end
# app/views/cache_query_tests/count.text.erb
==============
Rails MySQL Time: <%= @mysql_time.first.mysql_time %>
Ruby Time: <%= Time.now.strftime "%Y-%m-%d %H:%M:%S" %>
Rails MySQL Count: <%= @count %>
また、アプリの MySQL データベースの cache_query_tests テーブルに定期的にレコードを追加する小さなシェル スクリプトを実行しているため、理論的には、データベースはクエリをキャッシュしていません。
テスト ページを表示する URL にアクセスすると、次のようなさまざまな結果が表示されます。
==============
Rails MySQL Time: Mon Sep 16 10:40:57 UTC 2013
Ruby Time: 2013-09-16 10:40:58
Rails MySQL Count: 177
また:
==============
Rails MySQL Time: Mon Sep 16 09:47:46 UTC 2013
Ruby Time: 2013-09-16 10:16:32
Rails MySQL Count: 165
また:
==============
Rails MySQL Time: Mon Sep 16 09:50:02 UTC 2013
Ruby Time: 2013-09-16 10:41:32
Rails MySQL Count: 167
等々...
いずれの場合も、「Ruby Time」は最新で正しいため、ページ自体はキャッシュされません。ただし、ご覧のとおり、「Rails MySQL Time」は Ruby Time と同期していないことがよくあります。同様に、データベースにレコードを追加しているという事実にもかかわらず、「Rails MySQL Count」もかなり頻繁に間違っているため、Rails スタック内の何かがクエリ キャッシュを実行していると思います。
私の知る限りでは、Rails はrequest 内でのみクエリ キャッシングを行うことになっています。ここでは、何か (おそらく MySQL? おそらく Rack? おそらく Rails?) がリクエスト全体でそれを行っています。率直に言って、私はここからどこへ行くべきかかなり困惑しています。解決策が欲しいのですが:)、問題がどこにあるのかについてさらに意見をお願いします。
ありがとう。