Ruby on rails 是";带“U连接”;必要时加上“;执行查询;?

Ruby on rails 是";带“U连接”;必要时加上“;执行查询;?,ruby-on-rails,ruby,postgresql,activerecord,Ruby On Rails,Ruby,Postgresql,Activerecord,我偶尔会在带有PostgreSQL应用程序(通过乘客/Nginx提供)的Rails上检测到PG::trdeadlock,并跟踪到代码中使用ActiveRecord::Base.connection.execute的地方 为了解决这个问题,我将按照文档的建议,用.exec\u query或.exec\u update替换.exec。但是,ActiveRecord::Base.connection.exec_query是否从连接池获取连接还不清楚 在Rails控制器中使用ActiveRecord:

我偶尔会在带有PostgreSQL应用程序(通过乘客/Nginx提供)的Rails上检测到
PG::trdeadlock
,并跟踪到代码中使用
ActiveRecord::Base.connection.execute的地方

为了解决这个问题,我将按照文档的建议,用
.exec\u query
.exec\u update
替换
.exec
。但是,
ActiveRecord::Base.connection.exec_query
是否从连接池获取连接还不清楚

  • 在Rails控制器中使用
    ActiveRecord::Base.connection.exec\u query
    时,它是否必须使用
    ActiveRecord::Base.connection\u池进行包装?(我猜是的)
  • 在请求上下文之外使用
    ActiveRecord::Base.connection.exec_query
    时(例如作为cronjob执行的Rake任务),是否必须使用
    ActiveRecord::Base.connection\u pool.with_connection
    ?(我猜是的)
如果需要包装,是否有比以下更短的替代方案:

ActiveRecord::Base.connection_pool.with_connection do |connection|
  connection.exec_update "REINDEX INDEX my_complex_index"
end
(我猜是没有)


谢谢你的提示

有意思,有消息来源吗?我在同一个堆栈中遇到相同的问题。我不太确定是什么原因导致了它,只是意识到在我添加了使用
调用原始sql的模型方法后,它开始出现。执行
。似乎线程与me@mkrl
execute
vs
exec\u查询
实际上与死锁无关,但应确保正确清理。@mkrl至于连接池,我已经仔细研究了AR源代码,但我不能100%确定我做得对(因此请在这里提问)。我的猜测是,当不同的线程选择相同的连接并创建循环锁时,就会发生死锁。连接池应该可以防止这种情况。@svoop是的,我正在考虑这个问题。我不确定你的情况,但我使用的是开源版本。据我所知,只有客运企业能够产生额外的线程。