2011-02-09 11 views
1


在Java Web應用程序中,我想知道它是否是一種適當的(或「標準」?)方式,以便所有基本數據(如配置數據,消息數據,代碼維護數據,下拉選項數據等(假設所有數據都不會經常更新)在服務器啓動時從數據庫加載爲「靜態」變量。

還是通過查詢每個請求的數據庫檢索數據更受歡迎的方式?

感謝您的所有建議。在啓動時檢索所有重要數據

回答

2

將在應用程序生命週期中不會被修改的所有數據抽出並保存爲單例或其他內容是完全有效的。

這是一個好主意,因爲它可以節省數據庫命中和檢索速度。許多特定於環境的設置和其他數據也可以被拉一次,並保存在一個不可變的哈希表中,以用於將來的任何請求。

在一個常見的網絡應用程序中,您通常沒有太多的配置數據/選項對象,它們會佔用大量內存並導致OOM。但是,如果您有一張包含成百上千個配置數據的表格,最好假設在請求時提取對象。如果想要保存在內存中,可以考慮將它放在一些像MemcacheD這樣的關鍵值存儲中。

+0

內存是否是這種方法唯一的問題?
正如我害怕* OutOfMemory *如果這些表在未來保持增長。 – Cube 2011-02-09 16:45:31

+0

@Cube考慮如何配置表格和多少行。可以說,你有`3000`,每個配置對象都帶有`10`字符串字段,每個字符串都帶有`1000`字符。你將會採取'30MB` - 這並不多。即使你的數據增長了30倍的'30K'配置對象,你也會吃掉'300MB',這在網絡服務器上不高,因爲你可以高效地從中獲得它。但是,30K配置對象並不現實。如果您有很多配置設置,請考慮使用MemcahceD作爲配置對象存儲。 – Nishant 2011-02-09 16:52:03

0

我們使用DB來存儲配置值和ehcache以避免很多數據庫命中。這樣你就不用擔心內存消耗了(它會使用你擁有的任何內存)。

ehcache的是許多可用DB緩存解決方案中的一個,並且可以在JPA的頂端被配置等

可以配置ehcache的(或許多其他緩存提供商)認爲表只讀的,在這種情況下它只有在明確告知使緩存無效的情況下才會轉至數據庫。這表現相當不錯。儘管讀取頻率非常高(比如100 /秒),但是通常會將配置值存儲在局部變量中,並避免讀取內部循環,並在調用期間通過方法堆棧傳遞,從而使開銷變得明顯。

將值存儲在單例中作爲java對象執行效果最好,但是如果您想要在沒有應用程序的情況下修改這些值。啓動,它變得有點牽扯。

這裏有一個簡單的方法來實現動態配置與Java對象:

private volatile ImmutableMap<String,Object> param_value 

基本上你就必須開始考慮多線程訪問,與內存的問題(雖然這是不太可能,你會由於配置值而導致內存不足,除非將二進制數據作爲配置值等)。

從本質上講,我建議使用DB和一些緩存提供者,除非那部分代碼真的需要高性能。

相關問題