在 Sidekiq 作业结束之前释放 ActiveRecord 连接

2024-01-02

此问题涉及实现 Sidekiq 作业的方式的性能和优化问题。

假设我们有以下工作流程

定义执行

# Step 1
do_things_with_activerecord_db_and_get_some_parameters()

# Step 2
step2_perform_an_http_request_with_these_parameters_on_unreliable_server()

end

在以下情况下,ActiveRecord 连接在步骤 1 中从池中获取,并且仅在 SideKiq 的 ActiveRecord 中间件完成(或失败)作业后才会由 SideKiq 释放。

由于我们在步骤2中进行请求的外部http服务器不可靠,因此http请求可能会花费很长时间甚至超时,因此ActiveRecord连接会一直被锁定,对吗?

所以我的问题是:拨打以下电话是否相关、有用且安全:

ActiveRecord::Base.clear_active_connections!

在步骤 1 和步骤 2 之间,以便作业自行释放资源并使其可用于其他类似作业?或者我错过了一些关于连接池的事情?这个方法也可以应用在redis连接上吗?

提前致谢!


您肯定想调用clear_active_connections!。

我们在 TorqueBox 服务器上使用 JMS 的环境中运行 ActiveRecord,并且必须执行类似的操作以确保释放连接。

需要注意的是,如果您生成一个使用 ActiveRecord 的线程,则还需要执行此操作,因为(当然在 ActiveRecord 3.2 中)线程 id 用作连接签出过程的一部分。

我们反复使用的模式如下:

def with_connection(&block)
  ActiveRecord::Base.connection_pool.with_connection do
    yield block
  end
ensure
  ActiveRecord::Base.clear_active_connections!
  ActiveRecord::Base.connection.close
end

你可以这样使用:

with_connection do 
  do_things_with_activerecord_db_and_get_some_parameters()   
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Sidekiq 作业结束之前释放 ActiveRecord 连接 的相关文章

随机推荐