在Java Web應用程序中,我想知道它是否是一種適當的(或「標準」?)方式,以便所有基本數據(如配置數據,消息數據,代碼維護數據,下拉選項數據等(假設所有數據都不會經常更新)在服務器啓動時從數據庫加載爲「靜態」變量。
還是通過查詢每個請求的數據庫檢索數據更受歡迎的方式?
感謝您的所有建議。在啓動時檢索所有重要數據
1
A
回答
2
將在應用程序生命週期中不會被修改的所有數據抽出並保存爲單例或其他內容是完全有效的。
這是一個好主意,因爲它可以節省數據庫命中和檢索速度。許多特定於環境的設置和其他數據也可以被拉一次,並保存在一個不可變的哈希表中,以用於將來的任何請求。
在一個常見的網絡應用程序中,您通常沒有太多的配置數據/選項對象,它們會佔用大量內存並導致OOM。但是,如果您有一張包含成百上千個配置數據的表格,最好假設在請求時提取對象。如果做想要保存在內存中,可以考慮將它放在一些像MemcacheD這樣的關鍵值存儲中。
0
我們使用DB來存儲配置值和ehcache以避免很多數據庫命中。這樣你就不用擔心內存消耗了(它會使用你擁有的任何內存)。
ehcache的是許多可用DB緩存解決方案中的一個,並且可以在JPA的頂端被配置等
可以配置ehcache的(或許多其他緩存提供商)認爲表只讀的,在這種情況下它只有在明確告知使緩存無效的情況下才會轉至數據庫。這表現相當不錯。儘管讀取頻率非常高(比如100 /秒),但是通常會將配置值存儲在局部變量中,並避免讀取內部循環,並在調用期間通過方法堆棧傳遞,從而使開銷變得明顯。
將值存儲在單例中作爲java對象執行效果最好,但是如果您想要在沒有應用程序的情況下修改這些值。啓動,它變得有點牽扯。
這裏有一個簡單的方法來實現動態配置與Java對象:
private volatile ImmutableMap<String,Object> param_value
基本上你就必須開始考慮多線程訪問,與內存的問題(雖然這是不太可能,你會由於配置值而導致內存不足,除非將二進制數據作爲配置值等)。
從本質上講,我建議使用DB和一些緩存提供者,除非那部分代碼真的需要高性能。
相關問題
- 1. 。檢索所有數據
- 2. 從數據庫檢索數據。僅在需要時才檢索或獲取所有內容?
- 3. 首次啓動時創建SQL數據庫,並在下次啓動時檢索數據庫數據
- 4. 在啓動圖像顯示時從API檢索數據
- 5. 需要幫助列出所有數據從Microsoft SQL Server檢索
- 6. 檢索數據需要多長時間?
- 7. 在搜索文本時不要從頭開始重新啓動
- 8. 從sqlite中檢索所有數據
- 9. 檢索所有行數據庫的Grails
- 10. 檢索nsarray的所有數據
- 11. 數據庫啓動時檢測
- 12. 重新啓動應用程序時不要丟失數據?
- 13. MySQL - 檢索數據沒有重複
- 14. 應用程序需要在數據庫重新啓動時重新部署
- 15. 在活動啓動時立即從Firebase數據庫檢索內容
- 16. 如何在應用程序啓動時通過解析自動檢索數據?
- 17. 刷新或重新啓動後Feed會丟失所有數據
- 18. 如何重新啓動應用程序的所有數據?
- 19. 重新啓動時StreamWriter數據丟失
- 20. 爲什麼加速計沒有按時啓動或正常檢索數據?
- 21. iCarousel - viewForItemAtIndex在啓動時加載所有索引
- 22. 在啓動/重啓時啓動Resque
- 23. 想要從數據庫檢索數據
- 24. 重新啓動Neo4j時,爲什麼所有數據都會消失?
- 25. 正在檢索要拖放的數據
- 26. 搜索數據時無法啓動搜索活動android
- 27. 在啓動時發送的所有localnotifications
- 28. kafka在重新啓動時丟失所有主題
- 29. 所有cygwin git回購在重新啓動時變得腐敗
- 30. 僅在ValueEventListener啓動後檢索已更改的數據
內存是否是這種方法唯一的問題?
正如我害怕* OutOfMemory *如果這些表在未來保持增長。 – Cube 2011-02-09 16:45:31
@Cube考慮如何配置表格和多少行。可以說,你有`3000`,每個配置對象都帶有`10`字符串字段,每個字符串都帶有`1000`字符。你將會採取'30MB` - 這並不多。即使你的數據增長了30倍的'30K'配置對象,你也會吃掉'300MB',這在網絡服務器上不高,因爲你可以高效地從中獲得它。但是,30K配置對象並不現實。如果您有很多配置設置,請考慮使用MemcahceD作爲配置對象存儲。 – Nishant 2011-02-09 16:52:03