Java 弹簧&x2B;Ehcache:如何缓存查找所有结果

Java 弹簧&x2B;Ehcache:如何缓存查找所有结果,java,spring,ehcache,hibernate,Java,Spring,Ehcache,Hibernate,我正在使用Spring+Ehcache作为缓存层。(通过代理) 我想知道您是否可以在同一个缓存上缓存“findAll”结果和“findById”结果,然后缓存退出特定项和“findAll”结果(保留该项的其余部分不变),并在更新时再次“findById”时将其加载回缓存 (或者另一种方法是将findAll和findById保留在2个缓存中,并在更新cacheexecute allEntries时删除findAll缓存和findById缓存上的特定项) 这可能吗?我将解释它的第二级缓存和查询缓存是

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

我想知道您是否可以在同一个缓存上缓存“findAll”结果和“findById”结果,然后缓存退出特定项和“findAll”结果(保留该项的其余部分不变),并在更新时再次“findById”时将其加载回缓存

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

这可能吗?

我将解释它的第二级缓存和查询缓存是如何工作的,让您大致了解一下。首先,Hibernate在所谓的二级缓存中缓存所有单个实体(例如,由
findById
操作类型检索)

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

无效化相当简单:
INSERT
DELETE
操作应该使整个
findAll
查询缓存无效,而
UPDATE
是透明的


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

我没有使用hibernate,因此我想我的问题没有简单的解决方案。所以我想我只会在插入/删除时使所有缓存失效,并且只缓存所有条目。(对于我的参考数据)和缓存单个数据(对于实际域对象)。谢谢