2011-11-09 35 views
6

tôi có các thiết lập của ứng dụng Rails của tôi như sau:Rails sản xuất "PGError: Máy chủ đã đóng kết nối bất ngờ" sau một thời gian chờ

  • Rails: 3.0.5 (dưới Apache proxy) chạy trên RHEL 5.6
  • Postgres: 8.4, chạy trên Windows Server 2008 2 máy chủ trên cùng một mạng LAN.

Vấn đề là, sau một thời gian nhàn rỗi, khi tôi thực hiện một yêu cầu mới vào ứng dụng Rails, nó mang lại cho tôi những lỗi sau:

ActiveRecord::StatementInvalid (PGError: server closed the connection unexpectedly 
    This probably means the server terminated abnormally 
    before or while processing the request. 

Từ những gì tôi đã nghiên cứu, có vẻ như rằng kết nối cơ sở dữ liệu bị giảm sau một thời gian chờ bởi Postgres. Trong thời gian này, từ phía Rails,

  • nếu tôi thực hiện một yêu cầu đến Rails (1st theo yêu cầu), nó sẽ hiển thị các lỗi kết nối như trên
  • nếu tôi thực hiện một yêu cầu đến Rails (2nd yêu cầu) Rails dường như kết nối lại với Postgres và hoạt động chính xác.

Điều đó có nghĩa là tôi sẽ luôn gặp phải lỗi kết nối đầu tiên sau đó sẽ hoạt động bình thường trở lại, rất nghiêm trọng trong trường hợp của tôi vì tôi muốn gửi phản hồi không đúng cho khách hàng của mình.

tôi luôn nhìn vào câu hỏi và câu trả lời sau, nhưng họ dường như không phù hợp với trường hợp của tôi:

Bạn có lời khuyên nào để làm cho ứng dụng của tôi không bị lỗi kết nối db không? Cảm ơn bạn.

+0

Tôi gặp lỗi tương tự khi sử dụng postgresql với heroku – Salil

+0

Việc kết nối sẽ biến mất là điều bình thường. Nó không phải là bình thường để Rails đối xử với nó quá vô ơn. Kiểm tra trình điều khiển cơ sở dữ liệu (adapter) của bạn đang thực hiện 'verify!' Và 'active?'; bình thường 'ActiveRecord :: ConnectionAdapters :: ConnectionPool' cung cấp cho các bộ chuyển đổi một cơ hội để kết nối lại bất kỳ kết nối cũ ngay lập tức trước khi kiểm tra nó ra khỏi hồ bơi. Bạn đang sử dụng gem nào cho Postgres? – vladr

Trả lời

1

Trong database.yml, bạn có tùy chọn reconnect: true được đặt cho kết nối không? ví dụ:

production: 
    adapter: postgresql 
    database: myapp 
    username: deploy 
    password: password 
    reconnect: true 

Tôi không chắc chắn về lỗi cụ thể, nhưng không có tùy chọn này, bạn cần tự xử lý một lớp lỗi db dự kiến.

4

Chúng tôi gặp sự cố này trên Heroku, rất nhiều. Là một giải pháp hackish, đây là những gì chúng tôi đã làm. Đặt thông tin sau vào trong ApplicationController của bạn:

prepend_before_filter :confirm_connection 
def confirm_connection 
    c = ActiveRecord::Base.connection 
    begin 
    c.select_all "SELECT 1" 
    rescue ActiveRecord::StatementInvalid 
    ActiveRecord::Base.logger.warn "Reconnecting to database" 
    c.reconnect! 
    end 
end 

Về cơ bản, kiểm tra kết nối trên mỗi bộ điều khiển được nhấn. Có thể mở rộng? Không hẳn. Nhưng nó đã khắc phục vấn đề cho chúng tôi.

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