2015-01-11 11 views
6

私は、Rails 4.2プロジェクトでforkを使用するRakeタスクを持っています。私はフォークと自動的に接続を閉じるにはActiveRecordを疑わまずActiveRecordがフォーク後にPostgres接続を切断する原因は何ですか?

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

:私の問題は、私は再びデータベースにアクセスしようとしたとき、私は、次のPostgresのエラーを取得するフォーク処理後(すなわちProcess.wait後)が終了したということですプロセスは終了する。しかし、ARのconnection_pool.rbのコードを読んだ後、フォークのプロセスは、独自の接続を使用する必要があることを思わ:

接続が がその後フォーク持っている必要があり、先祖のプロセスに設立されました。接続を再利用することはできませんが、 をコピーして新しい接続を確立することができます。

ActiveRecord::ConnectionAdapters::ConnectionHandler#pool_for_ownerから)

それにもかかわらず、フォークは無用接続をレンダリングします。

私はすべてのデータベースにアクセスしてからフォークプロセスを防ぐためにしようと、古い接続がフォーク後に次のコードを再利用することができないことが検証:この問題を解決する方法について

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

任意の提案を?

+0

おそらくここの答えは役に立ちますか? http://stackoverflow.com/questions/13089875/fork-ruby-activerecord-and-file-descriptors-on-fork – margold

答えて

1

子プロセスが作業を完了した後、ActiveRecord::Base.establish_connectionでDBへの接続を再確立できます。その後、RakeプロセスはいつものようにDBにアクセスできるはずです。

関連する問題