gpt4 book ai didi

ruby-on-rails - Sidekiq 中的 ActiveRecord::Base.connection.query_cache_enabled

转载 作者:行者123 更新时间:2023-12-03 16:10:12 25 4
gpt4 key购买 nike

我有一段代码一遍又一遍地执行相同的查询,它是在一个线程内的后台工作程序中执行的。

我 check out 了 activerecord 查询缓存中间件,但显然它需要在使用前启用。但是,我不确定这样做是否安全以及是否会影响其他正在运行的线程。

你可以在这里看到测试:https://github.com/rails/rails/blob/3e36db4406beea32772b1db1e9a16cc1e8aea14c/activerecord/test/cases/query_cache_test.rb#L19

我的问题是:我可以借用和/或直接使用中间件在线程中安全地在块的持续时间内启用查询缓存吗?

当我尝试 ActiveRecord::Base.cache do我的 CI 开始左右失败......

最佳答案

编辑: Rails 5 及更高版本:即使对于像 Sidekiq 这样的后台作业,ActiveRecord 查询缓存也会自动启用(有关如何禁用它的信息,请参阅:https://github.com/mperham/sidekiq/wiki/Problems-and-Troubleshooting#activerecord-query-cache)。

Rails 4.x 及更早版本:
将 ActiveRecord::QueryCache 应用于 Sidekiq 工作人员的困难在于,除了它作为中间件的实现细节之外,它还意味着在请求期间构建并在请求结束时销毁。由于后台作业没有请求,所以清除缓存时需要小心。一种合理的方法是仅在 perform 期间缓存方法,不过。

因此,要实现这一点,您可能需要基于 ActiveRecord::QueryCache 编写自己的 Sidekiq 中间件。但关注 Sidekiq's middleware guide .例如。,

class SidekiqQueryCacheMiddleware
def call(worker, job, queue)
connection = ActiveRecord::Base.connection
enabled = connection.query_cache_enabled
connection_id = ActiveRecord::Base.connection_id
connection.enable_query_cache!

yield
ensure
ActiveRecord::Base.connection_id = connection_id
ActiveRecord::Base.connection.clear_query_cache
ActiveRecord::Base.connection.disable_query_cache! unless enabled
end
end

关于ruby-on-rails - Sidekiq 中的 ActiveRecord::Base.connection.query_cache_enabled,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31678318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com