2012-12-02 55 views
0

我從前面的問題繼續我提出(下面的鏈接)Spring MVC的 - 從二級緩存加載參考數據

Spring MVC - Get reference data from database on server startup

在先前的帖子得到一些意見後,這種方法我想我可以用它來負載參考數據是,添加以下方法在ArticleController(我的控制器類)

@ModelAttribute 
    public void populateModel(@RequestParam String number, Model model) { 
     model.addAttribute("countryList", articleService.getCountryList()); 
     model.addAttribute("skillsList", articleService.getSkillsList()); 
    } 

然後用冬眠第二級高速緩存像下面,

@Entity 
    @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_ONLY) 
    public class Country { 
     ... 
    } 

同樣,對於技能類

我有三個問題

  1. 威爾populateModel方法(@ModelAttribute)得到執行一次?即在對ArticleController類執行第一個@RequestMapping方法之前(對於多個會話中的所有請求 - 我在日誌跟蹤中看到ArticleController在啓動服務器時被初始化)?
  2. 爲了達到二級緩存,我還需要做些什麼嗎? (contry list and skills list純粹只讀取兩個單獨表格中的數據)
  3. 我錯過了任何隱含點,您可以提供建議。
+1

您是否查看過http://code.google.com/p/ehcache-spring-annotations/上的Spring EhCache項目?我使用它來完成你所描述的任務 - 它基本上緩存了方法的響應,併爲你提供了在刷新之前設置週期的能力等。使用非常簡單(註釋)和設置。 – nickdos

回答

0
  1. 號的方法將被調用爲每個請求,如在the documentation說明。順便說一句,如果它只被調用一次,它會在哪裏找到請求參數(你不使用,BTW)?

  2. 如果除了第二級緩存以外,還沒有啓用查詢緩存,並且查詢可以緩存,那麼Hibernate會執行一個SQL查詢來每次從數據庫加載國家ID,然後加載實體本身來自二級緩存。如果查詢緩存被啓用並且查詢是可緩存的,那麼Hibernate將執行單個查詢來加載緩存中的所有國家,並且之後不再執行任何查詢(至少對於緩存區域的TTL)

  3. 我想我已經做了我能做的事情:-)。你可以閱讀the following article以獲得更好的理解。

+0

另一個有用的文章在這裏... https://community.jboss.org/wiki/ConfigureEhcacheAsASecondLevelCache?_sscc=t – Sachin

0

在回答問題1,此方法:

@ModelAttribute 
    public void populateModel(@RequestParam String number, Model model) { 
     model.addAttribute("countryList", articleService.getCountryList()); 
     model.addAttribute("skillsList", articleService.getSkillsList()); 
    } 

標有註解@ModelAttribute。這意味着每次調用此控制器中的任何@RequestMapping註釋方法時,都會執行該方法(之前)。

如果您要緩存某些模型屬性,將它們作爲@RequestMapping方法公開將是更好的選擇。