2011-02-14 30 views
1

我有許多全局應用程序設置存儲在數據庫中的一個名爲「settings」的表中。它有三列:id,key,value。在DB中高效地存儲/檢索Rails應用程序的全局設置

現在我們假設我有一個產品清單列出了30種產品。顯示這些產品中的每一個需要從設置表中檢索特定設置「交換率」。我做到這一點的方式是嚮應用幫助程序添加了一個函數「exchange_rate」,該函數用鍵「exchange rate」查找設置行並檢索值。

現在你可能會問什麼?嗯,真的沒什麼,它工作得很好,但是當我按照開發服務器日誌,我注意到每個請求有這些條目的30:

CACHE(0.0ms)選擇settings * FROM settings WHERE(settingskey ='。 EXCHANGE_RATE')LIMIT 1

CACHE(0.0ms)選擇settings。* FROM settings WHERE(settingskey = 'EXCHANGE_RATE')LIMIT 1

它看起來非常醜陋和雜波我的日誌。原因很明顯:數據庫條目被檢索了30次。它似乎沒有任何數據庫負載,因爲它說CACHE,所以不應該有任何性能問題(或者有 - 我不知道)。

我的問題是:它是「更乾淨」,更合理的檢索這個全局變量(匯率)一次,然後將它保存在某處(在哪裏?),這樣我就不會看到這些看起來多餘(雖然緩存)數據庫請求?

回答

3

是的,解決這個問題的最好方法是將值存儲在類變量中。例如:

class Settings 
    def self.exchange_rate 
    @@exchange_rage ||= (execute your SQL query and get the result here) 
    end 
end 

隨時隨地這樣,你叫Settings.exchange_rate你只會執行查詢的第一次。剩下的時間將使用@@ exchange_rate類變量。

在原始示例中,唯一的性能影響是生成SQL查詢和高速緩存命中,因此它肯定存在,但不像每次需要匯率時實際觸及數據庫那麼糟糕。

+0

這是一個很好的答案,謝謝。你認爲有一種簡單的推廣方法,所有的設置都是這樣加載的,而不必爲每個設置單獨的函數? – 2011-02-15 11:14:18

相關問題