Иногда я получаю PG::TRDeadlockDetected
в Rails с приложением PostgreSQL (обслуживается через Passenger / Nginx) и прослеживаю его до тех мест в коде, которые используют ActiveRecord::Base.connection.exececute
.
Чтобы это исправить, я заменяю .execute
на .exec_query
или .exec_update
в соответствии с рекомендациями документации. Однако на самом деле неясно, получает ли ActiveRecord::Base.connection.exec_query
соединение из пула соединений или нет.
- При использовании
ActiveRecord::Base.connection.exec_query
в контроллере Rails нужно ли его оборачивать ActiveRecord::Base.connection_pool.with_connection
? (мое предположение: да)
- При использовании
ActiveRecord::Base.connection.exec_query
вне контекста запроса (скажем, задачи Rake, выполняемые как cronjob), должен ли он быть заключен в ActiveRecord::Base.connection_pool.with_connection
? (мое предположение: да)
А если необходимо обертывание, есть ли более короткие альтернативы по сравнению с:
ActiveRecord::Base.connection_pool.with_connection do |connection|
connection.exec_update "REINDEX INDEX my_complex_index"
end
(мое предположение: нет)
Спасибо за ваши подсказки!