ruby-on-rails – PG :: TRDeadlockDetected:ERROR:检测到死锁

我通过bundle exec pumactl -F config / puma.rb重新启动8个美洲狮工作人员.现在我越来越多的postgres错误
PG::TRDeadlockDetected: ERROR:  deadlock detected

我发现大约有50个空闲的postgres进程运行:

postgres: myapp myapp_production 127.0.0.1(59950) idle
postgres: myapp myapp_production 127.0.0.1(60141) idle
...

当我运行bundle exec pumactl -F config / puma.rb stop时,它们消失.
使用bundle exec pumactl -F config / puma.rb启动启动应用程序后,我将获得正好16个空闲进程. (在我看来,八点太多了)

如何更好地管理这些流程?谢谢你的帮助!

更新

我的妈妈

environment 'production'
daemonize true

pidfile 'tmp/pids/puma.pid'
state_path 'tmp/pids/puma.state'

threads 0,1
bind 'tcp://0.0.0.0:3010'

workers 8

quiet

解决方法

我可能已经找到了一个解决我的问题的解决方案:我的控制器之外有一些查询(自定义中间件),这似乎引起了这个问题.

如果您在控制器外面有查询(ActiveMailer也可能导致此问题),请将代码放在ActiveRecord :: Base.connection_pool.with_connection块中:

ActiveRecord::Base.connection_pool.with_connection do
  # code
end

ActiveRecord的with_connection方法产生从其池到块的数据库连接.块完成后,将自动将连接重新连接到池中,避免连接泄漏.

我希望这有助于你们!

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...