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?
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