**1.**对于二级缓存,只能设置超时时间但不能强制刷新/清除实体缓存?或者添加注解 @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) ,例如每次执行 saveorupdate/mergeupdate 时自动刷新/清除缓存? hibernateTemplate.flush() 与此有什么关系?
2.为所有实体启用二级缓存好吗?如果我在缓存所有实体时不希望缓存时间太长,那么你们在这种情况下使用 ehcache 的平均超时是多少?
请您参考如下方法:
1) 如果需要,您可以手动从二级缓存中逐出实体。 SessionFactory为此目的有几种方法;驱逐某个实体(或集合)的单个实例;其他人驱逐给定类(或给定实体名称/角色名称)的所有实体。
也就是说,您通常不必这样做 - Hibernate 会为您更新缓存(除非您正在执行一些相当具体的操作,例如 SQL 更新 - 在这种情况下请澄清您的问题)。
2) 一般来说 - 不,缓存所有实体并不好。缓存不可变实体以及那些经常加载/很少更新的实体通常是一个好主意;假设你没有很多。但同样,这实际上取决于您在做什么。
超时是一个拐杖(或者是一种保护措施,如果你愿意的话),旨在保持你的缓存大小/状态合理,即使你不这样做。好的缓存策略不应该依赖它。