8

Tôi có một ứng dụng 4 đường ray Tôi đang lưu trữ trên heroku. Họ đưa ra một số lời khuyên cụ thể về cách quản lý hồ bơi kết nối DB của bạn khi sử dụng máy chủ đa luồng (puma) https://devcenter.heroku.com/articles/concurrency-and-database-connectionsHeroku Rails - Tắt kết nối Active Record Postgres

Khi tôi chạy thử tải cho ứng dụng của mình, tôi gặp lỗi - không thể kết nối với db. khi mỗi trang bị trúng, đường ray sẽ khởi tạo bản ghi hoạt động, ngay cả khi tôi không thực hiện bất kỳ truy vấn nào trên trang đó hoặc tham chiếu bất kỳ mô hình nào.

Câu hỏi của tôi là:

Làm thế nào tôi có thể làm cho một loại danh sách trắng (hoặc danh sách đen) để ghi lại hoạt động không được khởi tạo với một kết nối db cho những hành động điều khiển cụ thể? Trong một initializer?

Lý tưởng nhất là tôi sẽ chạy dịch vụ bưu chính rẻ hơn trên heroku (40 kết nối) vì tôi biết ứng dụng của tôi không sử dụng db thường xuyên. Nếu lưu lượng truy cập tăng cao hơn thì 40 kết nối sẽ bắt đầu xuất hiện lỗi, điều này có vẻ ngớ ngẩn đối với ứng dụng không sử dụng db trên các yêu cầu đó.

Tôi đọc về làm thế nào để vô hiệu hóa kỷ lục hoạt động cho toàn bộ ứng dụng: Disable ActiveRecord for Rails 4

Nhưng làm thế nào để lựa chọn kích hoạt nó? Có bất kỳ vấn hiệu suất khác nhau khác ở đây (bằng cách tải không háo hức những điều này hoặc bất kỳ gotchas khác)

+0

kết nối sử dụng tổng hợp. –

Trả lời

0

Trong bạn application_controller.rb

before_filter :maybe_disconnect_db 

def maybe_disconnect_db 
    ActiveRecord::Base.remove_connection() if ActiveRecord::Base.connected? 
end 

def maybe_connect_db 
    ActiveRecord::Base.establish_connection() unless ActiveRecord::Base.connected? 
end 

Sau đó cho mỗi bộ điều khiển/hành động mà cần kết nối db thêm

skip_before_filter :maybe_disconnect_db, #only or unless filter here 
before_filter  :maybe_connect_db, #only or unless filter here 

Điều này sẽ thiết lập kết nối cho bất kỳ yêu cầu db cụ thể nào và ngắt kết nối cho bất kỳ yêu cầu nào không cần, đồng thời xử lý nhiều yêu cầu db liên tiếp mà không có tác vụ và nhiều yêu cầu không phải db trong một hàng không hành động.

ActiveRecord::Base.remove_connection

ActiveRecord::Base.establish_connection

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