2011-03-03 55 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

相关问题