2016-01-13 50 views
1

项目X包含以下几部分:在Spring /休眠中正确使用高速缓存

a。 Spring数据存储库具有不同的方法,如:

@Cacheable(value = "xobjects", unless = "#result == null") 
XObject findByParamA(String paramA); 

@Cacheable(value = "xobjects", unless = "#result == null") 
XObject findByParamB(String paramB); 

@CacheEvict("xobjects") 
<E extends XObject> E save(E entity); 

b。 Hibernate也使用“xobjects”缓存。

问题#1 既然有加的对象的2种方式缓存时相同的对象出现2次,也可能是这种情况。如何更好地解决这个问题?例如使用结果对象中的键。喜欢的东西:

键=“#result.id”

问题#2 我不想从缓存中驱逐所有对象时,“保存”方法被调用,但我不确保当前的实施将起作用。 “保存”方法有xobject作为输入,所以CacheEvict将它用作驱逐的关键,没有我期望会发生的事情。在这里,我相信能够像上面一样使用魔术键的相同方法会很好。

更新#1其实我觉得我的建议能正常工作,这里是一个样本 - https://github.com/zhangkaitao/spring4-showcase/blob/master/spring-cache/src/main/java/com/sishuok/spring/service/UserService2.java 但我需要先进行测试。稍后将分享结果。

+2

您确定要为此使用Spring Cache抽象或使用您的ORM提供程序的第二级缓存,因为它会自动为您执行这些操作。 –

+0

我在想这件事,那很好。我已经用@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)标记了XObject并启用了“hibernate.cache.use_second_level_cache”。但是上面的方法没有被缓存。查询缓存会有帮助吗? – ICE

回答

1

您的方法将不起作用或将很难维护。除了需要手动维护缓存之外,如果希望管理它们,则需要将实体实例合并回每个新的Hibernate会话(持久性上下文),因为从您自己的缓存中返回的实体将始终被分离。

最好的方法是使用Hibernate二级缓存,它将自动为您执行缓存条目生命周期作业。