Mar*_*arc 6 ruby-on-rails ruby-on-rails-3.2
我有一个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 %>
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?)正在跨越请求.坦率地说,我很难过这里的去处.虽然我想要一个解决方案:),但我还想了解更多关于问题可能存在的意见.
谢谢.
为了帮助任何遇到同样问题的不幸 SOB,我们最终将其追溯到 Octopus gem ( https://github.com/tchandy/octopus )。请注意,我不确定此行为是否是有意为之或可配置的,因此我不想责怪章鱼,而只是注意到这就是原因。
| 归档时间: |
|
| 查看次数: |
343 次 |
| 最近记录: |