2015-01-11 15 views
6

Tôi có một nhiệm vụ Rake trong dự án Rails 4.2 sử dụng fork. Vấn đề của tôi là sau khi quá trình chia hai đã kết thúc (tức là sau khi Process.wait) Tôi nhận được lỗi Postgres sau khi tôi cố gắng để truy cập vào cơ sở dữ liệu một lần nữa:Điều gì khiến ActiveRecord phá vỡ kết nối Postgres sau khi tắt?

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

Lúc đầu, tôi nghi ngờ ActiveRecord để tự động đóng kết nối khi chia hai quá trình kết thúc. Nhưng sau khi đọc mã của AR của connection_pool.rb có vẻ như quá trình forked nên sử dụng các kết nối riêng của họ:

Một kết nối được thành lập trong một quá trình tổ tiên mà phải có sau đó chia hai. Chúng tôi không thể tái sử dụng kết nối, nhưng chúng tôi có thể sao chép đặc điểm kỹ thuật và thiết lập kết nối mới với nó.

(từ ActiveRecord::ConnectionAdapters::ConnectionHandler#pool_for_owner)

Tuy nhiên, forking ám chỉ rằng kết nối vô dụng.

tôi đã cố gắng để ngăn chặn quá trình chia hai từ truy cập vào cơ sở dữ liệu ở tất cả và xác minh rằng các kết nối cũ không thể được tái sử dụng với mã sau đây sau khi forking:

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

Bất kỳ đề xuất về cách giải quyết này?

+0

có thể câu trả lời ở đây sẽ giúp ích? http://stackoverflow.com/questions/13089875/fork-ruby-activerecord-and-file-descriptors-on-fork – margold

Trả lời

1

Sau khi tiến trình con hoàn thành công việc của họ, bạn có thể thiết lập lại kết nối đến DB với ActiveRecord::Base.establish_connection. Sau đó quá trình Rake của bạn sẽ có thể truy cập DB như bình thường.

Các vấn đề liên quan