2011-03-03 107 views
0

我是Ehcache的新手,正在尋找如何做到這一點,但現在很確定這是否是正常用例。我正在研究一個不是傳統Web應用程序的應用程序,它的功能一次只能由少數人使用,用於從非常大的數據集中檢索數據,而不是每次對數據庫進行調用時想要使用緩存來緩存這個大表。但是,有可能將新條目添加到此表中,並且我需要將其反映在緩存中,但我不希望每次重新加載整個緩存都是相當大的。有關如何處理這些/更多資源的任何建議,我們感激不盡。Ehcache,Hibernate,在添加新條目時更新超大型表的緩存?

回答

1

您應該瞭解Hibernate query cache。簡而言之:它可以在二級緩存(L2)之上工作並存儲查詢結果。 但是它只存儲查詢應該返回的記錄的id,而不是整個列表。這意味着你需要有L2工作和微調。

在您的方案中,假設您在表T中有1M個記錄,並且平均返回1K的查詢。當您第一次運行此查詢就會錯失查詢緩存和:

  1. 運行SQL
  2. 取1K記錄
  3. 把所有的人都在L2
  4. 把1K IDS查詢緩存中

下一次執行查詢時,它會打到查詢緩存並查找L2的所有結果。當你修改表T時,有趣的部分來了。 Hibernate會發現查詢緩存中的結果可能是陳舊的,它會使整個緩存失效,而不是L2。它基本上會重複1-4點,但只刷新查詢緩存(表格T中的大多數實體已經在L2中)。

在某些情況下,它工作的很好,在其他情況下,它會在不可預測的時刻引入N + 1問題。這只是冰山一角,你應該非常小心,因爲這種機制非常脆弱,需要很好的理解。

+1

只是一個額外的評論:「Hibernate會發現查詢緩存中的結果可能是陳舊的,它會使整個緩存失效,但不會L2」。當應用程序遇到查詢使用的表(更新,插入,刪除數據)或不時(無論先發生什麼)時,Hibernate將使查詢緩存失效。因此,如果直接更改數據庫中的數據,Hibernate將不會知道它,並可能在認爲緩存仍然有效(即:缺失數據)的同時返回陳舊結果。 – jpkrohling 2011-03-04 10:13:05

相關問題