8

我有一個rails 4應用程序,我託管在heroku上。他們給出了一些關於如何在使用多線程服務器時管理數據庫連接池的具體建議(美洲獅)https://devcenter.heroku.com/articles/concurrency-and-database-connectionsHeroku Rails - 關閉活動記錄Postgres連接

當我爲我的應用程序運行負載測試時出現錯誤 - 無法連接到數據庫。當每個頁面被擊中時,rails會初始化活動記錄,即使我沒有在該頁面上進行任何查詢或引用任何模型。

我的問題是:

我怎樣才能做一個排序白名單(或黑名單),使活動記錄不爲這些特定的控制器操作的數據庫連接初始化?在初始化器中?

理想情況下,我會在heroku上運行更便宜的postgres服務(40個連接),因爲我知道我的應用程序並不經常使用db。如果流量高於40個連接,事情就會出現錯誤,這對於那些不會在這些請求中使用數據庫的應用程序似乎很愚蠢。

我讀到有關如何禁用活動記錄爲整個應用程序:Disable ActiveRecord for Rails 4

但我怎麼選擇性地啓用呢?是否還有其他的不同性能考慮這裏(通過不預先加載這些東西,或任何其他陷阱)

+0

使用連接池。 –

回答

0

在你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 

然後爲每個控制器/操作需要數據庫連接添加

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

這應該爲任何特定的數據庫請求建立連接,並斷開不需要它的任何請求的連接,同時還處理一行中的多個數據庫請求而無需操作,並且連續處理多個非數據庫請求沒有行動。

ActiveRecord::Base.remove_connection

ActiveRecord::Base.establish_connection