在Sidekiq作业结束之前释放ActiveRecord连接
这个问题涉及性能和优化问题,以及实现Sidekiq工作的方式。
假设我们有以下工作流程
def执行
# Step 1 do_things_with_activerecord_db_and_get_some_parameters() # Step 2 step2_perform_an_http_request_with_these_parameters_on_unreliable_server()
结束
在下面的情况中,在步骤1中从池中获取ActiveRecord连接,并且只有在SideKiq的ActiveRecord中间件完成(或失败)作业后,SideKiq才会释放该连接。
由于我们执行请求的步骤2中的外部http服务器不可靠,因此http请求可能需要很长时间甚至超时,因此ActiveRecord连接在所有时间都没有锁定,对吧?
所以我的问题是:打电话是否恰当,有用和安全:
ActiveRecord的:: Base.clear_active_connections!
在步骤1和步骤2之间,以便作业自己释放资源并使其可用于其他类似的作业? 或者我错过了关于连接池的一些事情? 这种方法也可以应用于redis连接吗?
谢谢提前!
你肯定想打电话给clear_active_connections!
我们在TorqueBox服务器上使用JMS的环境中运行ActiveRecord,我们必须做类似的事情以确保连接被释放。
作为一个警告,如果你生成一个使用ActiveRecord的Thread,你也需要这样做,因为(当然在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