“with_connection”是否需要与“exec_query”一起使用?

svo*_*oop 6 ruby postgresql activerecord ruby-on-rails

我偶尔会使用PG::TRDeadlockDetectedRails with PostgreSQL 应用程序(通过 Passenger/Nginx 提供服务)并跟踪它到代码中使用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
Run Code Online (Sandbox Code Playgroud)

(我的猜测:没有)

感谢您的提示!