我们有一个在Oracle后端上运行的Rails 4.2应用程序,其中memcached / Dalli作为缓存存储。
QueryCache似乎不适用于同一请求中的重复SQL。根据文档:
查询缓存是一种Rails功能,可缓存返回的结果集 通过每个查询。如果Rails再次遇到相同的查询 请求,它将使用缓存的结果集,而不是运行 再次查询数据库。
application / production.rb中的配置将缓存存储设置为Dalli,并在生产中将query_cache切换为true:
application.rb: config.cache_store = :dalli_store, 'localhost:11211', { namespace: 'BASE', down_retry_delay: 120 }
environments/production.rb: config.action_controller.perform_caching = true
以详细模式运行memcached,我可以看到我们显式的低级缓存(即Rails.cache.set)中的所有访存,设置和未命中,但是没有任何查询缓存的迹象。 (尽管我不确定100%查询缓存是否应达到memcached或是否仅在请求期间保留在内存中)。鉴于我可以看到memcached中的其他缓存活动,因此我相当确定memcached和rails之间的连接/设置是可以的。
我认为它没有被缓存有两个原因:
我看到的一个建议是查看中间件以确认是否存在QueryCache,这似乎是:
dave@test:~/code/app1$ rake middleware
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware>
use ActiveRecord::QueryCache
另一建议是明确检查(并设置)ActiveRecord::Base.connection.query_cache_enabled
。
我把它放在了我当前正在尝试优化的方法的before_filter中,它报告自己已被启用,但是仍然没有缓存:
def enable_qcache
ActiveRecord::Base.connection.enable_query_cache!
logger.error "IS CACHE ENABLED: #{ ActiveRecord::Base.connection.query_cache_enabled}"
end
production.log: IS CACHE ENABLED: true
以下是同一请求中来自日志的相同选择的示例:
Policy Load (12.2ms) SELECT * FROM (SELECT "POLICY".* FROM "POLICY" WHERE "POLICY"."POLICY_ID" = :a1 ORDER BY policy_original_number DESC, policy_id DESC ) WHERE ROWNUM <= 1 [["policy_id", 459723071]]
Policy Load (11.5ms) SELECT * FROM (SELECT "POLICY".* FROM "POLICY" WHERE "POLICY"."POLICY_ID" = :a1 ORDER BY policy_original_number DESC, policy_id DESC ) WHERE ROWNUM <= 1 [["policy_id", 459723071]]
Policy Load (9.0ms) SELECT * FROM (SELECT "POLICY".* FROM "POLICY" WHERE "POLICY"."POLICY_ID" = :a1 ORDER BY policy_original_number DESC, policy_id DESC ) WHERE ROWNUM <= 1 [["policy_id", 459723071]]