2015-01-11 14 views
6

Ich habe eine Rake-Task in einem Rails 4.2-Projekt, das fork verwendet. Mein Problem ist, dass nach dem gegabelten Prozess (dh nach Process.wait) beendet hat, ich die folgenden Postgres-Fehler, wenn ich versuche, wieder auf die Datenbank zuzugreifen:Was bewirkt, dass ActiveRecord die Postgres-Verbindung nach dem Forking unterbricht?

PG::ConnectionBad: PQconsumeInput() server closed the connection unexpectedly 

Zuerst habe ich Active Verdacht automatisch die Verbindung zu schließen, sobald die gegabelten Prozess endet. Aber nach dem Code AR des connection_pool.rb Lesen scheint es, dass gegabelt Prozesse ihre eigenen Verbindungen nutzen sollten:

Eine Verbindung wurde in einem Vorfahren Prozess etabliert, die anschließend gegabelt haben muss. Wir können die Verbindung nicht wiederverwenden, aber wir können die Spezifikation kopieren und eine neue Verbindung damit aufbauen.

(von ActiveRecord::ConnectionAdapters::ConnectionHandler#pool_for_owner)

Trotzdem Forking rendert die Verbindung nutzlos.

Ich versuchte, den gegabelten Prozess der Zugriff auf die Datenbank überhaupt und überprüft zu verhindern, dass die alten Verbindungen nicht mit dem folgenden Code nach Forking wiederverwendet werden:

ActiveRecord::Base.default_connection_handler = nil 
ActiveRecord::Base.connection_handler = nil 

Vorschläge, wie dieses Problem zu lösen?

+0

vielleicht hilft die Antwort hier? http://stackoverflow.com/questions/13089875/fork-ruby-activecord-and-file-descriptors-on-fork – margold

Antwort

1

Nachdem die untergeordneten Prozesse ihre Arbeit beendet haben, können Sie mit ActiveRecord::Base.establish_connection eine Verbindung zur DB herstellen. Danach sollte Ihr Rake-Prozess wie gewohnt auf die DB zugreifen können.