2009-10-19 92 views
3

我有一個網站,允許以各種方式搜索內容列表,例如「顯示由用戶523按日期排序的東西」或「顯示最近10個帖子的列表」。緩存彈簧/休眠Web應用程序

我爲我的ORM使用Hibernate,Hibernate爲對象提供緩存。不過,對於對象列表,就像最新內容的首頁列表一樣,我對如何最好地緩存該內容感到茫然。現在,我有我的Spring控制器只返回一個標準的JSP頁面,然後在調用另一個類的JSP級別上使用oscache。

雖然這看起來不雅觀。我真正想要的是讓我的控制器有權訪問緩存的結果(如果有),以便JSP可以關注顯示結果。

我在這裏有什麼選擇?

回答

3

你的意思是你想緩存hibernate查詢的結果,除了實體嗎?如果是這樣,那麼你需要看看query caching

+0

不完全。查詢緩存看起來很整潔,但也很有限,在許多情況下容易出現頻繁刷新。我希望以某種方式更一般地緩存對DAO的任意調用,但我確定這正是我想要的。我只是想知道是否有任何我不知道的標準技術。例如,堆棧溢出使用什麼來呈現其首頁,或每次訪問觸發數據庫讀取? – 2009-10-19 07:54:11

+0

我認爲你可能在做緩存服務的查詢緩存,我沒有發現它是有限的,而且它的刷新過於頻繁,那麼它需要調整和配置,就像任何緩存技術一樣。 – skaffman 2009-10-19 07:55:36

0

對於這個緩存,Hibernate的分割問題在兩個層面:

  1. 對應於查詢ID列表:這個結果是主題在許多方面改變。例如,如果查詢使用的任何表格發生更改,則結果可能會更改。無論是否有效更改將很難計算和保持最新,因此在大多數情況下效率低下。所以Hibernate選擇不緩存對應於查詢的ID。
  2. 一旦與查詢相對應的ID列表已知,則還需要與返回的實體相對應的所有數據,以及所有獲取的實體(或組件)。在這裏,我們假設你決定這些實體是恆定的,並且足夠的讀取以便緩存它們是明智的。這個數據檢索完全受益於常規的二級Hibernate緩存

緩存效率和簡化代碼,我分裂這樣的結果我想在兩個層面緩存:

  • 查詢只返回的ID(加上沒有選擇的可能實體牽強第二級休眠緩存)
  • 由ID讀取的其它數據,以從第二級高速緩存中受益