Rails 3.2 app似乎是在跨请求缓存查询?

Mar*_*arc 6 ruby-on-rails ruby-on-rails-3.2

我有一个Rails 3.2应用程序,提供过时的内容.一个典型的场景:

  1. 管理员在后端添加一些新记录
  2. 用户去查看这些资源的索引页面
  3. 它们不会显示在页面上
  4. 他们刷新; 资源现在在那里
  5. 他们刷新; 资源不存在
  6. 等等

我创建了一个模型/控制器/视图,所以我可以测试一下:

# 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 %>
Run Code Online (Sandbox Code Playgroud)

我还运行了一个小的shell脚本,它会定期将记录添加到应用程序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
Run Code Online (Sandbox Code Playgroud)

要么:

==============
Rails MySQL Time: Mon Sep 16 09:47:46 UTC 2013
Ruby Time:        2013-09-16 10:16:32
Rails MySQL Count: 165
Run Code Online (Sandbox Code Playgroud)

要么:

==============
Rails MySQL Time: Mon Sep 16 09:50:02 UTC 2013
Ruby Time:        2013-09-16 10:41:32
Rails MySQL Count: 167
Run Code Online (Sandbox Code Playgroud)

等等...

在所有情况下,"Ruby Time"是最新且正确的,因此页面本身不会被缓存.但是,正如您所看到的,"Rails MySQL Time"经常与Ruby Time不同步.同样,"Rails MySQL Count"也常常是错误的,尽管我正在向数据库添加记录,所以这就是为什么我认为Rails堆栈中的某些东西正在执行查询缓存.

据我所知,Rails只应该在请求中进行查询缓存.在这里,某些东西(也许是MySQL?也许是Rack?也许是Rails?)正在跨越请求.坦率地说,我很难过这里的去处.虽然我想要一个解决方案:),但我还想了解更多关于问题可能存在的意见.

谢谢.

Mar*_*arc 0

为了帮助任何遇到同样问题的不幸 SOB,我们最终将其追溯到 Octopus gem ( https://github.com/tchandy/octopus )。请注意,我不确定此行为是否是有意为之或可配置的,因此我不想责怪章鱼,而只是注意到这就是原因。