【问题标题】:Rails caching database queries for json onlyRails 仅针对 json 缓存数据库查询
【发布时间】:2015-02-10 07:03:01
【问题描述】:

对于我们的生产环境,我们在 Rails(3.2 版)中进行了配置

config.action_controller.perform_caching = false

奇怪的是,我们发现(通过启用调试)SQL 查询在收到 JSON 请求时会碰到 SQL 缓存。页面从未命中缓存,数据正常。

有谁知道 Rails 中对于 JSON 请求和 SQL 缓存是否有一些特殊行为?

另外,我们有 config.threadsafe!,我们正在使用 JRuby。

注意我们在 Chrome 和 Safari 中测试了我们的网页,都出现了同样的问题:页面本身有正确的数据,而 JSON 请求(有时)没有。

注意:如果有人能说明这里是否使用了 QueryCache#call 方法

https://github.com/rails/rails/blob/3-2-stable/activerecord/lib/active_record/query_cache.rb

这会很棒,因为无论上述设置如何,它似乎都使用缓存。

可能值得一提的是,特定问题与current_user.related_object 之类的代码有关;从缓存中获取related_object SQL 结果的位置。 current_user 由身份验证 gem devise 保存。

更新

我们已经跟踪了这个问题,并且似乎在多线程环境中没有正确清除 SQL 缓存(同样,我们使用了 JRuby)。由于我们所有的页面都有 JSON 请求,因此存在一些与未清除的 SQL 缓存浮动的连接,这会在重用时导致后续请求出现问题。

作为一种解决方法,我们在ApplicationController 中添加了一个before_filter 方法来清除当前连接的SQL 缓存。

【问题讨论】:

    标签: ruby-on-rails multithreading caching jruby


    【解决方案1】:

    默认是中间件设置,查看rake middleware RAILS_ENV=production

    你可以避免查询缓存,就像any other middle-ware

    config.middleware.delete ActiveRecord::QueryCache

    值得注意的是,它与config.action_controller.perform_caching 无关......查询缓存仅尝试“缓存”每个连接生命周期(除非有 tx 提交/回滚)相同类型的查询(current_user.related_object调用了两次),并且由于强制执行数据库连接签出,它通常在 JRuby 上会适得其反——我建议禁用。

    【讨论】:

    • 谢谢@kares。奇怪的是,current_user.related_object 对 HTML 请求不使用 SQL 缓存(或为空),但它对通过相同代码的 JSON 请求使用先前存储的 SQL 结果。我们推测由于浏览器具有“保持活动状态”并且可能重用 HTTP 连接,因此可能会发生一些事情。但这也太奇怪了——我们迷路了。
    • 很抱歉,我无法为您提供详细信息,因为我不确定我是否理解“真正的”问题 - 也许您应该设置一个公共 Rails 应用程序来演示该问题并在以下情况下寻求帮助你太喜欢摆弄这个了......
    • 我的一个同事正在关闭网络 - 显然在多线程模式下清除 SQL 缓存会清空错误的对象。我会及时向大家发布。非常感谢!!
    • 我们喜欢 QueryCache 中间件,它应该是每个请求一个,但如前所述 - 它似乎不适合多线程环境(在 JRuby 中)。为了解决这个问题,我们添加了before_filter 来清除当前连接的 SQL 缓存。这是一种解决方法,而不是问题的根源——但那里的 Rails 代码库非常复杂......
    猜你喜欢
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 2010-09-25
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多