Gemäß der API-Dokumentation ist der Rails Reaper dazu gedacht, Verbindungen von toten Threads zu finden und wiederherzustellen. Der Reaper wird basierend auf der reaping_-Frequenz ausgeführt.Rails Reaper funktioniert nicht
Ich stoße Fälle auf, wenn die Anzahl der Datenbankverbindungen die angegebene Grenze überschreitet und es Verbindungen im Leerlaufzustand gibt, aber der Reaper diese Verbindungen nicht zurücksetzt. Ich habe versucht, den Reaper manuell zu starten, aber es scheint keinen Effekt zu haben.
reaper = ActiveRecord::ConnectionAdapters::ConnectionPool::Reaper.new(ActiveRecord::Base.connection, 10)
reaper.run
Dass es keine Wirkung hat wurde mit verifizierter
ActiveRecord::Base.connection.execute("SELECT * FROM pg_stat_activity WHERE pid <> pg_backend_pid()")
PgHero.total_connections
Ist das ein Fehler mit dem Schnitter in Active oder ist nicht gemeint, wie dies funktioniert? Wenn das der Fall ist, wie ist die Option, einen benutzerdefinierten Reaper zu schreiben, um tote Verbindungen wiederherzustellen? Das PG-Gem wird für die Verbindung mit Postgres db verwendet. Die Abfrage, die die Verbindungen auffressen wird, ist:
SHOW TRANSACTION ISOLATION LEVEL
Rails-Version: 4.2.3
pg gem Version: 0.17.1
Postgres Version: 9.4.6
Schienen App Server: Puma
Haben Sie die PID der an die DB angeschlossenen Prozesse überprüft? Hast du sichergestellt, dass es keine toten Rubinprozesse gibt? Normalerweise müssen Sie keine Verbindungen selbst ernten. Machst du deinen Code falsch? Wie ist dein Puma aufgebaut? Du brauchst den richtigen 'before_fork' /' after_fork' Code in deiner Puma Konfiguration. –
Können Sie uns Ihre Puma-Konfiguration geben, vor allem, wie viele Arbeiter und Threads verwenden Sie? Wie groß ist Ihr Verbindungspool in 'database.yml'? – BoraMa