Joh*_*ith 5 activerecord multithreading ruby-on-rails
我有一段代码一遍又一遍地执行相同的查询,它在线程中的后台工作程序中执行此操作.
我签出了activerecord查询缓存中间件,但显然需要在使用前启用它.但是我不确定这是否安全,是否会影响其他正在运行的线程.
你可以在这里看到测试:https://github.com/rails/rails/blob/3e36db4406beea32772b1db1e9a16cc1e8aea14c/activerecord/test/cases/query_cache_test.rb#L19
我的问题是:我可以直接借用和/或使用中间件来在线程中安全地阻止块的持续时间吗?
当我尝试ActiveRecord::Base.cache do我的CI开始左右失败...
将ActiveRecord :: QueryCache应用于Sidekiq工作人员的困难在于,除了作为中间件的实现细节之外,它意味着在请求期间构建并在其结束时销毁.由于后台作业没有请求,因此清除缓存时需要注意.但是,合理的方法是仅在perform方法期间缓存.
因此,要实现这一点,您可能需要编写自己的Sidekiq中间件,基于ActiveRecord :: QueryCache,但遵循Sidekiq的中间件指南.例如,
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1306 次 |
| 最近记录: |