【问题标题】:Does rails perform SQL Caching for Actions not involving controller?Rails 是否为不涉及控制器的操作执行 SQL 缓存?
【发布时间】:2017-01-12 09:01:02
【问题描述】:

The rails documentation 表示每个操作都会执行 SQL 缓存。但是我不清楚“每一个动作”是什么意思。标准 Rails 工具箱中是否有任何类型的进程可以免于缓存?

例如,ActiveJob 会从 SQL 缓存中受益吗? Rake 任务呢?

【问题讨论】:

    标签: ruby-on-rails ruby caching


    【解决方案1】:

    运行rack middleware,您会看到use ActiveRecord::QueryCache - 这是负责在请求期间缓存您的查询的中间件。

    This method 在动作开始时运行,this method - 在动作完成时运行。

    有趣的方法是this one - 它调用查询缓存模块来执行所有的缓存。文档是here。

    我的猜测是你可以在任何你喜欢的方法中使用这个模块 - 后台作业、rake 任务等。这个模块默认包含在activerecord 中,因此可以在任务开始时启用查询缓存运行/方法:

    ActiveRecord::Base.connection.enable_query_cache!
    

    当方法/任务完成时,执行这两个方法:

    ActiveRecord::Base.connection.clear_query_cache
    ActiveRecord::Base.connection.disable_query_cache!
    

    注意请记住禁用查询缓存 - 否则缓存将在您可能不需要的地方执行。 还要执行分析并仅在您知道它不会引起副作用的情况下使用此缓存。还有一件事:这是一个单例方法 - 当您启用此缓存时,它会为整个进程启用。

    【讨论】:

    • answer 看起来不错,但还要注意 ActiveRecord::Base 用于定义 Rails 模型,而不是控制器。如果在控制器中触发的对象和关联的数据库调用是通过模型完成的,则 SQL 查询将被缓存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 2015-10-28
    • 2016-01-28
    • 2014-07-19
    • 1970-01-01
    • 2011-07-09
    • 2015-11-23
    相关资源
    最近更新 更多