3 回答

TA贡献1725条经验 获得超7个赞
缓存是一个非常复杂的话题。您不必自己处理缓存。这就是休眠二级缓存的用途。
诸如 ORM(对象关系映射)框架之类的数据库抽象层的优点之一是它们能够透明地缓存从底层存储中检索到的数据。这 有助于消除频繁访问数据的数据库访问成本。
您仍然必须将实体配置为可缓存以及休眠应缓存的积极程度,但其余部分将由休眠处理
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
class Resident {
...

TA贡献1856条经验 获得超17个赞
我不同意关于缓存的公认答案。我有另一个答案,我已经详细解释了为什么我不喜欢使用 Redis 进行休眠二级缓存的休眠二级缓存 - 它会提高性能吗?到目前为止,使用休眠二级缓存并不是一种常见的缓存策略。有几个原因:
Hibernate 二级缓存效率很低。它使用默认的 java 序列化,这非常慢并且非常缺乏内存。
经常使用休眠二级缓存需要保持关系的一致性。一个这样的例子是当您需要从集合中删除一个元素时。如果您使用简单的 pojoes,保持一致性通常不是什么大问题,但是当您开始将持久性逻辑与缓存混合时,它开始变得非常烦人。
如果您决定从纯二级缓存转到带有休眠的分布式缓存。复杂性会以一种不好的方式飙升,然后您将很难了解为什么休眠缓存效率低下。
我会与接受的答案完全相反,建议您将缓存与持久性分离为简单的 Pojos。并通过这些 Pojo 管理缓存。
现在关于你的模型。我不知道您所涵盖的功能,但我强烈怀疑任何人都无法获取拥有所有居民的城镇。我建议您删除从城镇到居民的 OneToMant 关系。基于此,我看到以下场景:
以居民为中心的数据处理,您可能会重复点击居民。您可以决定缓存完整的居民和城镇,或者如果您没有找到同一个居民,您可以决定只缓存城镇。
将城镇和居民缓存在同一区域,您的处理以居民为中心。您可以选择在城镇和居民的同一个键下缓存在一起,您会牺牲一些内存是的。但是,您将一口气对记忆和城镇产生直接影响。
Resident 和 Town 的两个缓存区域,但是您需要为 1 resident 执行两次查找。在内存方面效率更高,在性能方面并非如此。
缓存只镇。无论如何,无论您如何决定。我个人不会使用休眠二级缓存:)
添加回答
举报