我正在使用Spring + Ehcache作为我的缓存层。 (通过代理)
我想知道你是否可以在同一个缓存中缓存“findAll”结果和“findById”结果,然后CacheEvict特定项目和“findAll”结果(保持项目的其余部分不变)以及更新和再次“findById”时将其加载回缓存?
(或另一种方法是在2个缓存中保存findAll和findById,以及在findAll缓存和findById缓存上的特定项更新CacheEvict allEntries时)
这可能吗?
答案 0 :(得分:3)
我将解释hibernate如何使用其第二级和查询缓存来为您提供一般概念。首先,Hibernate在所谓的二级缓存中缓存所有单个实体(例如,通过findById
类型的操作检索)。
如果使用findAll
检索所有实体,则会将所有实体的主键放入查询缓存(一个键下)和二级缓存中的所有具体实体。再次调用findAll
时,它首先从查询缓存中检索所有主键,然后从二级缓存(或从数据库)中检索所有实体。
失效非常简单:INSERT
和DELETE
操作会使整个findAll
查询缓存失效,而UPDATE
是透明的。
这应该指导您如何在解决方案中实现这一点。这在Spring中是可能的,但您可能需要编写一些代码,尤其是从查询缓存到二级缓存的部分映射。