在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