加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – sidekiq中的ActiveRecord :: Base.connection.

发布时间:2020-12-17 03:32:46 所属栏目:百科 来源:网络整理
导读:我有一段代码一遍又一遍地执行相同的查询,它在线程中的后台工作程序中执行此操作. 我签出了activerecord查询缓存中间件,但显然需要在使用前启用它.但是我不确定这是否安全,是否会影响其他正在运行的线程. 你可以在这里看到测试:https://github.com/rails/ra
我有一段代码一遍又一遍地执行相同的查询,它在线程中的后台工作程序中执行此操作.

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

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

我的问题是:我可以直接借用和/或使用中间件来在线程中安全地阻止块的持续时间吗?

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

解决方法

将ActiveRecord :: QueryCache应用于Sidekiq工作人员的困难在于,除了作为中间件的实现细节之外,它意味着在请求期间构建并在其结束时销毁.由于后台作业没有请求,因此清除缓存时需要注意.但是,合理的方法是仅在执行方法期间缓存.

因此,要实现这一点,您可能需要编写自己的Sidekiq中间件,基于ActiveRecord::QueryCache但是在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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读