什么被缓存在二级缓存中?

时间:2017-02-08 12:49:56

标签: java hibernate

从Hibernate文档(强调我的):

  

默认情况下,实体不属于二级缓存,我们建议您坚持使用此设置。但是,您可以通过在persistence.xml文件中设置shared-cache-mode元素或在配置中使用javax.persistence.sharedCache.mode属性来覆盖它。

什么被缓存在二级缓存中?

3 个答案:

答案 0 :(得分:0)

你有一级缓存和二级缓存。 第一级缓存仍然在事务上,这就是为什么必须调用flush以便在使用相同行的事务之间保持一致的原因。 然而,二级缓存在事务之间共享。

缓存相同的对象,区别在于它们是否在会话之间共享。

答案 1 :(得分:0)

默认情况下,禁用第二个缓存。

  1. 如果您尝试加载entiry,hibernate会尝试在第一级现金中找到它。如果第一级缓存中没有缓存实体,则会查找二级缓存以获取缓存实体。
  2. 如果二级缓存具有缓存实体,则它将作为load方法返回。但是,在返回实体之前,它也存储在第一级缓存中,以便下一次调用实体的加载方法将从第一级缓存本身返回实体,并且不需要再次进入二级缓存。
  3. 如果您想使用二级缓存,请尝试以下方法:

    @Entity
    @Table(name = "for_second_cache")
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
    public class ObjectForSecondCache{
        private Set<Document> documents;
    }
    

    此外,您应该知道二级缓存有许多不同的提供程序。

答案 2 :(得分:0)

Hibernate有2种缓存机制。

<强> 1。第一级缓存:

默认启用,无法禁用。它适用于会话中提供的缓存,即打开会话并执行数据库调用时。

例如,如果你为特定的id调用了session.get(<entity>, <id>)并且在关闭会话之前,如果你再次使用相同的id调用它,那么Hibernate只会调用一次数据库,存储在第一级缓存;而对于第二个,它只是从缓存中获取它。

当执行session.save()并且某些属性更新(在会话中)时,您可以看到好处,然后它会触发更新查询以反映所做的更改,而无需调用{{1 }}

<强> 2。二级缓存:

<强> 一个。缓存实体:

默认情况下已禁用此功能,并且适用于各个会话。它通常用于在会话工厂内的不同会话之间维护缓存,但也可以扩展到多个集群。

启用二级缓存后,您还需要指定要考虑用于缓存的类/实体。这可以确保Hibernate在调用数据库之前查看二级缓存(和第一级缓存)并相应地更新缓存,以便可以从缓存本身提供/检索更多请求。

例如,

session.update()

<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<property name="cache.use_second_level_cache">true</property>

<强> 湾缓存查询:

同样,需要显式启用查询缓存以使查询可缓存。仅当启用了二级缓存时,这才有效。 在这种情况下,您需要使用@Entity @Cacheable @Cache(usage=CacheConcurrencyStrategy.READ_ONLY) public class EntityToBeCached ... 对正在执行的查询标记查询/查询,以及在调用DB之前需要在缓存中查找的其他查询。

这是启用二级缓存所必需的。

query.setCacheable(true)

描述已经很长了,但我希望你有这个想法:)