首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制Hibernate将实际实例存储在二级缓存中

强制Hibernate将实际实例存储在二级缓存中
EN

Stack Overflow用户
提问于 2015-05-15 18:40:11
回答 1查看 691关注 0票数 1

Hibernate将缓存的实体存储为CachedEntry类的实例,这意味着每次从二级缓存请求实体时,都会从CachedEntry中包含的数据创建该实体的新实例。

在大多数情况下,这是一种很好的方法,因为它防止缓存的数据被请求实体的代码意外地修改。但是,当存储的实体不可变时,这是不可能发生的。

我们有一堆包含相当大数据的实体对象(有很多属性),一旦写入,它们就永远不会改变,因此实体对象是不可变的

是否有一种方法强制Hibernate将不可变对象存储为“实际实例”,这意味着对于每个不同的实体,缓存中只存在一个不变的实例,这些实例将始终被返回,而不是一直创建新实例?

我希望Hibernate会有带有@Immutable注释的对象的这种行为,但事实并非如此。

EN

回答 1

Stack Overflow用户

发布于 2015-05-15 20:24:48

也不可能在Hibernate中对不可变的对象(实体)执行此操作,原因很多,主要涉及关联:

  • 假设一个不可变对象有一个相关联的集合(也是不可变实体的集合)。该集合可以是惰性的,这意味着对象实际上是可变的。懒散到一个映射也是如此。
  • 缓存驱逐和过期策略将很难定义。如果条目过期或从缓存区域中被逐出,那么在缓存中的其他实体中对该对象的引用怎么办?
  • 将实体存储到缓存将是更昂贵的操作,因为它将涉及存储实体及其所有加载的关联(每个存储到自己的缓存区域),并检查图形的哪些部分已经在缓存中。
  • 使用当前的Hibernate内部程序很难处理这种分离的实体。
  • 底层缓存提供程序将只存储对对象的引用。它将无法将缓存内容扩展到磁盘、关闭堆或压缩它以获得更好的内存管理。

这些是我第一次想到的原因,而且可能还有许多其他的障碍会使Hibernate很难实现这一点。

您可以在这个博客中找到更多关于Hibernate二级缓存的信息,当然也可以在官方文档中找到更多信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30266580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档