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

Java 在二级缓存中缓存什么?,java,hibernate,Java,Hibernate,从Hibernate文档(我的重点): 默认情况下,实体不是二级缓存的一部分,我们建议您坚持此设置。但是,您可以通过在persistence.xml文件中设置共享缓存模式元素或在配置中使用javax.persistence.sharedCache.mode属性来覆盖这一点 二级缓存中缓存了什么?您得到了一级缓存和二级缓存。 第一级缓存保留在事务上,这就是为什么必须调用flush,以便在使用同一行的事务之间保持一致。 但是,二级缓存在事务之间共享 缓存的对象相同,区别在于它们是否在会话之间共享。您

从Hibernate文档(我的重点):

默认情况下,实体不是二级缓存的一部分,我们建议您坚持此设置。但是,您可以通过在persistence.xml文件中设置共享缓存模式元素或在配置中使用javax.persistence.sharedCache.mode属性来覆盖这一点


二级缓存中缓存了什么?

您得到了一级缓存和二级缓存。 第一级缓存保留在事务上,这就是为什么必须调用flush,以便在使用同一行的事务之间保持一致。 但是,二级缓存在事务之间共享


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

您得到了一级缓存和二级缓存。 第一级缓存保留在事务上,这就是为什么必须调用flush,以便在使用同一行的事务之间保持一致。 但是,二级缓存在事务之间共享


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

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

  • 如果您尝试加载实体,则hibernate尝试在第一级cash中找到它。若一级缓存中并没有缓存的实体,那个么将在二级缓存中查找缓存的实体
  • 若二级缓存有缓存的实体,那个么它将作为load方法的结果返回。但是,在返回实体之前,它也存储在一级缓存中,以便下次调用实体的load方法时将从一级缓存本身返回实体,并且不需要再次转到二级缓存
  • 如果要使用二级缓存,请尝试以下操作:

    @Entity
    @Table(name = "for_second_cache")
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
    public class ObjectForSecondCache{
        private Set<Document> documents;
    }
    
    @实体
    @表(name=“用于第二个缓存”)
    @缓存(用法=CacheConcurrencyStrategy.READ\u WRITE)
    SecondCache的公共类对象{
    私人文件;
    }
    

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

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

  • 如果您尝试加载实体,则hibernate尝试在第一级cash中找到它。若一级缓存中并没有缓存的实体,那个么将在二级缓存中查找缓存的实体
  • 若二级缓存有缓存的实体,那个么它将作为load方法的结果返回。但是,在返回实体之前,它也存储在一级缓存中,以便下次调用实体的load方法时将从一级缓存本身返回实体,并且不需要再次转到二级缓存
  • 如果要使用二级缓存,请尝试以下操作:

    @Entity
    @Table(name = "for_second_cache")
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
    public class ObjectForSecondCache{
        private Set<Document> documents;
    }
    
    @实体
    @表(name=“用于第二个缓存”)
    @缓存(用法=CacheConcurrencyStrategy.READ\u WRITE)
    SecondCache的公共类对象{
    私人文件;
    }
    

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

    Hibernate有两种缓存机制

    1。一级缓存:

    默认情况下,它处于启用状态,无法禁用。它适用于会话中提供的缓存,即当会话已打开并执行数据库调用时

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

    如果执行了
    session.save()
    ,并且更新了某些属性(在会话中),则会触发更新查询以反映所做的更改,而无需调用
    session.update()

    2。二级缓存:

    a。缓存实体:

    这在默认情况下是禁用的,并且适用于所有会话。它通常用于在会话工厂中跨不同会话维护缓存,但也可以扩展到多个集群

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

    比如说,

    <property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
    <property name="cache.use_second_level_cache">true</property>
    
    b。缓存查询:

    同样,需要显式启用查询缓存以使查询可缓存。这仅在启用二级缓存时有效。 在这种情况下,您需要通过对正在执行的查询使用
    query.setCacheable(true)
    将查询/查询标记为可缓存,还需要在调用DB之前在缓存中查找进一步的查询

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

    <property name="cache.query_cache">true</property>
    
    true
    

    描述已经很长了,但我希望您能理解:)

    Hibernate有两种缓存机制

    1。一级缓存:

    默认情况下,它处于启用状态,无法禁用。它适用于会话中提供的缓存,即当会话已打开并执行数据库调用时

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

    如果执行了
    session.save()
    ,并且更新了某些属性(在会话中),则会触发更新查询以反映所做的更改,而无需调用
    session.update()

    2。二级缓存: