2012-12-01 33 views
1

閱讀了很多帖子後,我打算使用下面的方法從數據庫中提取參考數據(代碼尚未測試)。Spring MVC - 在服務器啓動時從數據庫獲取參考數據

@Override 
    protected Map referenceData(HttpServletRequest request) throws Exception { 

     //Data referencing for country list box 
     Map referenceData = new HashMap(); 
     referenceData.put("countryList", articleService.getCountryList()); 

     //Data referencing for skills list box 
     Map<String,String> javaSkill = new LinkedHashMap<String,String>(); 
     referenceData.put("skillsList", articleService.getSkillsList()); 

     return referenceData; 
    } 

參考的數據表如下

id key  value    type 
----------------------------------------- 
1 1  United States  countries 
2 2  India    countries 
3 3  United Kingdom  countries 
4 4  China    countries 
5 1  Java    skills 
6 2  Spring    skills 
7 3  Hibernate   skills 
8 4  SQL     skills 

我有兩個問題,

  1. 這是一個靜態引用數據(我不會改變它幾個月),所以我不想要爲每個請求創建數據庫,並且應該在服務器啓動時加載數據。這個怎麼做?
  2. 這是正確的方法還是我在認識錯誤方面是錯誤的?

回答

1

不,我會說這是一個正確的方法。你應該把國家放在自己的桌子上,並把技能放在自己的桌子上。

首先是因爲額外的列將不可避免地出現在國家,這對技能沒有任何意義(反之亦然)。

第二,因爲你會想引用數據庫中的其他表(和對象模型中的其他實體)的國家或技能。因此,例如,您需要從地址到國家的外鍵,而且您不希望地址引用技能而不是國家。你需要一個從地址到國家的ManyToOne關聯,而不是從地址到參考表。

我覺得你是預優化的。這樣的參考表很小,數據庫將把所有東西放在內存中。所以,即使你經常這樣做,查詢它們的速度也會非常快。

如果您想完全避免這些查詢,那麼您可以簡單地使用hibernate的二級緩存,這將使所有內容都變得透明(即,您將像往常一樣繼續編程,而Hibernate將進入緩存而不是去到數據庫)。這將帶來額外的優勢,例如能夠實際更新那些表中的信息而不會將過時值過長(或者根本沒有過時的值)。

+0

感謝您的投入JB。具體是關於外鍵部分。儘管我明白了爲什麼要將國家和技能表分開,但我仍然有一個關於在服務器啓動時加載參考數據的問題。我確信這必須在很多加載靜態參考數據的應用程序中完成。我試圖找出在這個schenario中採用的最常用的方法(我在帖子後仍然使用它) – Sachin

+2

常用的方法是使用二級緩存。然後等待第一個請求被執行並且懶惰地加載緩存,或者在啓動時執行假查詢和循環,以便立即填充緩存。我只是懶惰地做,只有在證明這會導致性能問題時才採取其他措施。 –

+1

那麼,如果一個表需要超級模塊化並且具有外鍵關係,那麼它不再是一個'reference'數據,並且您應該使用適當的ORM來訪問它。 – Isaac

2

我會創建一個Enumkeyvalue構造函數爲Country和另一個爲Skill。它肯定更容易出錯,但如果你仔細地構建它們,性能改進將是值得的。請參見下面的代碼:

public enum Country { 
    UNITED_STATES(1, "United States"), INDIA(2, "India"), UNITED_KINGDOM(1, "United Kingdom"), CHINA(4, "China"); 

    private int key; 
    private String value; 

    Country (int key, String value) { 
     this.key = key; 
     this.value = value; 
    } 

    public int getKey() { 
     return key; 
    } 

    public String getValue() { 
     return value; 
    } 
} 

所以你永遠需要去訪問數據庫來得到他們,並與枚舉你可以做所有樣的東西,枚舉,容易訪問的參考性,跨統一和一致的訪問參考數據的應用程序,而不是將它們包含在地圖中。

+0

我第二種方法。更好地保留靜態引用數據,像Enum一樣用於性能調整。 – WarFox