此问题涉及实现 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(使用前将#替换为@)