6

古いコンテンツを提供している Rails 3.2 アプリがあります。典型的なシナリオ:

  1. 管理者がバックエンドにいくつかの新しいレコードを追加します
  2. ユーザーはそれらのリソースのインデックス ページを表示します
  3. それらはページに表示されません
  4. 彼らはリフレッシュします。リソースは今そこにあります
  5. 彼らはリフレッシュします。リソースはそこにありません

これをテストできるように、モデル/コントローラー/ビューを作成しました。

# 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?) がリクエスト全体でそれを行っています。率直に言って、私はここからどこへ行くべきかかなり困惑しています。解決策が欲しいのですが:)、問題がどこにあるのかについてさらに意見をお願いします。

ありがとう。

4

2 に答える 2

0

同じ問題でここにたどり着く不運な SOB を助けるために、最終的にこれを Octopus gem ( https://github.com/tchandy/octopus ) まで追跡しました。この動作が意図されたものなのか、それとも設定可能なものなのかはわかりませんが、Octopus を責めるつもりはありませんが、これが原因であることに注意してください。

于 2013-09-23T13:10:40.440 に答える