【问题标题】:Hibernate : Is it possible to manually add objects to second level cache?Hibernate:是否可以手动将对象添加到二级缓存?
【发布时间】:2015-04-16 22:44:18
【问题描述】:

在我的项目中,我想缓存一些对象,但不是整个表。所以我的问题是,是否有一个 API 可以用来手动将对象添加到休眠二级缓存? (或者有没有办法为二级缓存指定表数据区域?)

【问题讨论】:

  • 我想不出你为什么要这样做。它不是你的缓存,所以你为什么要搞砸它。 jpa 将仅缓存使用的对象(检索/保存到 db...),因此您可以将其留给 Hybernate 来完成它的工作(尽管您可以配置它的大小和行为)。如果您需要自己的缓存,只需使用 Guava 缓存即可。

标签: java hibernate caching jpa second-level-cache


【解决方案1】:

你可以用@Cacheable(true)注释你想要缓存的实体

@Cacheable(true)
@Entity
public class Person { ... }

然后在你的persistence.xml配置文件中,你需要设置shared-cache-mode元素使用ENABLE_SELECTIVE

<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>

现在:

为所有实体启用缓存,指定 Cacheable(true)。 不缓存所有其他实体。

要指定区域,可以使用 Hibernate 特定的@Cache 注解:

@Cacheable(true)
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE, region="your-entity-region")
@Entity
public class Person { ... }

现在,您必须启用二级缓存:

<prop key="hibernate.cache.use_second_level_cache">true</prop>
<property name="hibernate.cache.region.factory_class">ehcache</property>

要将实体添加到二级缓存,您只需要加载实体(它会自动缓存):

Person person = entityManager.find(Person.class, 1L);

【讨论】:

  • 这很有帮助。但我只想缓存一些Person 对象。原因是有两个人,缓存所有这些可能是一个问题(内存和应用程序启动时所有对象都被缓存)。因此,我只希望具有特定条件(例如:age > 50)的人在缓存中,并且应该在应用程序启动时加载。
  • 如果您运行该查询,只有您选择的实体将被缓存,而不是数据库中的整个实体。这就是二级缓存的工作原理。
  • 是的。但最终大量数据将在缓存中(当数据被读取时)。有没有办法控制应该永久使用上述条件缓存的对象。 ( age
  • 您可以调用entityManager.evict(entity) 获取您不希望存储在缓存中的所有实体。
猜你喜欢
  • 2017-07-22
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
  • 2015-02-05
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
相关资源
最近更新 更多