2

我正在使用 Spring + Ehcache 作为我的缓存层。(通过代理)

我想知道你是否可以在同一个缓存中缓存“findAll”结果和“findById”结果,然后 CacheEvict 特定项目和“findAll”结果(保持项目的其余部分保持不变)并在更新和加载它回来再次“findById”时缓存?

(或另一种方法是将 findAll 和 findById 保留在 2 个缓存中,并在更新 CacheEvict allEntries 时为 findAll 缓存和 findById 缓存上的特定项目)

这可能吗?

4

1 回答 1

5

我将解释及其二级缓存和查询缓存是如何工作的,以便为您提供一个总体思路。首先,Hibernate在所谓的二级缓存中缓存所有单个实体(例如,按findById操作类型检索) 。

如果您使用findAll它检索所有实体,则将所有实体的主键放在查询缓存中(在一个键下),并将所有具体实体放在二级缓存中。当您findAll再次调用时,它首先从查询缓存中检索所有主键,然后从二级缓存(或从数据库)中检索所有实体。

失效相当简单:操作应该使整个查询缓存失效,而INSERTs是透明的。DELETEfindAllUPDATE

这应该指导您如何在您的解决方案中实现这一点。这在 Spring 中是可能的,但您可能需要编写一些代码,尤其是从查询缓存到二级缓存的部分映射。

于 2012-05-17T07:40:03.317 回答