app ruby-on-rails ruby postgresql puma idle-processing

ruby on rails - app - PG:: TRDeadlockDetected: ERROR: interbloqueo detectado



heroku app login (2)

Parece que esto puede deberse a que las conexiones de la base de datos no se cierran al cerrar el servidor. https://github.com/puma/puma/issues/59 Mucha gente en ese problema está usando ActiveRecord :: ConnectionAdapters :: ConnectionManagement para manejar esto, o puede hacer su propio rollo utilizando el gancho on_restart de Puma.

Estoy reiniciando 8 trabajadores de puma a través del bundle exec pumactl -F config/puma.rb phased-restart lo que funciona bien. Ahora estoy recibiendo más y más errores postgres:

PG::TRDeadlockDetected: ERROR: deadlock detected

Encontré alrededor de 50 de procesos postgres inactivos ejecutándose:

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

Desaparecen cuando estoy ejecutando bundle exec pumactl -F config/puma.rb stop . Después de iniciar la aplicación con el bundle exec pumactl -F config/puma.rb start , obtengo exactamente 16 procesos inactivos. (Ocho demasiados en mi opinión.)

¿Cómo puedo gestionar mejor estos procesos? ¡Gracias por tu ayuda!

Actualizar

Mi puma.rb:

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


Podría haber encontrado una solución a mi pregunta: tuve algunas consultas fuera de mis controladores (middleware personalizado), que parecen haber causado el problema.

Si tiene consultas fuera de los controladores (ActiveMailer también podría causar este problema), coloque su código en un bloque ActiveRecord::Base.connection_pool.with_connection :

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

El método with_connection de ActiveRecord produce una conexión de base de datos de su grupo al bloque. Cuando el bloque finaliza, la conexión se verifica automáticamente en el grupo, evitando las fugas de conexión.

¡Espero que esto ayude a algunos de ustedes!