“ exec_query”是否需要“ with_connection”?

时间:2018-11-17 09:50:01

标签: ruby-on-rails ruby postgresql activerecord

我偶尔会在Rails with PostgreSQL应用程序(通过Passenger / Nginx提供)上获得PG::TRDeadlockDetected,并将其追溯到使用ActiveRecord::Base.connection.exececute的代码中。

为了解决此问题,我根据文档建议将.execute替换为.exec_query.exec_update。但是,并不确定ActiveRecord::Base.connection.exec_query是否从连接池获取连接。

  • 在Rails控制器中使用ActiveRecord::Base.connection.exec_query时,是否必须用ActiveRecord::Base.connection_pool.with_connection包装? (我的猜测:是的)
  • 在请求上下文之外使用ActiveRecord::Base.connection.exec_query时(例如,作为cronjob执行的Rake任务),是否必须用ActiveRecord::Base.connection_pool.with_connection包装? (我的猜测:是的)

如果需要包装,与以下产品相比,有没有更短的选择?

ActiveRecord::Base.connection_pool.with_connection do |connection|
  connection.exec_update "REINDEX INDEX my_complex_index"
end

(我的猜测:不)

感谢您的提示!

0 个答案:

没有答案