【问题标题】:Hibernate Cache Reference休眠缓存参考
【发布时间】:2011-06-18 16:05:01
【问题描述】:

我正在寻找一个简单、完整、简洁的缓存列表,您将在使用 Hibernate 编写 JPA 时遇到这些缓存。

我特别想知道每个缓存、缓存的生命周期(缓存何时过时)、缓存的范围、清除缓存的方法(如果有)、缓存的内容、如果缓存默认开启,如何开启/关闭,以及任何有用的信息。

我尝试在另一个问题中查找此信息,但找不到任何完整的答案。答案也分布在 Hibernate 文档中,但我也很难在那里找到它们。

我计划自己作为社区 wiki 回答这个问题,以便让事情顺利进行,但我仍然不知道所有的答案,所以会有一些漏洞需要填补。

【问题讨论】:

    标签: hibernate caching jpa


    【解决方案1】:

    隔离级别缓存

    总结:这个缓存有时并不真正称为缓存。但是,为了实现某些隔离级别,数据库本身可能会缓存一些查询结果。

    生命周期/范围:此缓存的范围为单个 Session/EntityManager。生命周期与事务生命周期绑定。

    清除缓存:除了开始一个新事务我不知道

    缓存的内容:查询和结果(如果隔离处于可重复读取或可序列化级别)

    默认开启:取决于来自数据库的默认隔离级别。默认情况下,MySQL 带有可重复的读取隔离,所以是的,这是默认情况下为 MySQL 启用的。

    开启/关闭:可以在创建交易时指定。也可以通过更改数据库的默认值来更改。

    有用信息: Hibernate/JPA 除了指定所需的隔离级别之外,实际上并没有对此缓存的操作进行任何控制。

    会话级(一级)缓存

    总结:这个缓存就是EntityManager/Session缓存。我相信这也是所谓的持久化上下文。

    生命周期/范围:此缓存的范围为单个 Session/EntityManager。生命周期与事务生命周期绑定。

    清除缓存:在 EntityManager 或 Session 上调用 clear() 会清除整个缓存。在 Session 上调用 evict() 会从缓存中清除单个对象。

    缓存的内容:一切

    默认开启:

    开启/关闭:无法关闭

    有用信息:每当调用flush() 时,此缓存都会与数据库合并。除非发生这种情况,否则其他事务将无法看到此缓存中的内容。保证flush() 的最佳方式是提交事务。

    二级缓存

    总结:这是可以启用的二级缓存(通常是为了尝试提高性能)。

    Lifecycle/Scope:我相信这是绑定到 EntityManagerFactory/SessionFactory。此缓存的自动驱逐取决于缓存策略。在只读策略中,数据永远不会被自动驱逐。在读写或非严格读写策略中,数据将在会话关闭时被驱逐。 这不是 100% 确定的。

    清除缓存:您可以调用getCache().evict(class) 驱逐特定类,调用getCache().evictAll() 驱逐整个缓存。这些方法在 EntityManagerFactory 上。

    缓存的内容:您明确配置应缓存哪些实体。

    默认开启:

    开启/关闭:在休眠配置中开启/关闭

    有用信息:

    查询缓存

    总结: 查询缓存是一个缓存,存储查询、查询参数和结果。如果查询和查询参数相同,则可以预期结果相同。

    生命周期/范围:我不知道这个缓存中的数据何时被确定为陈旧。我相信范围在 EntityManagerFactory/SessionFactory 级别。此外,Hibernate 为每个表保留一个“Hibernate 上次更新”时间戳的列表。 Hibernate 使用这些时间戳来确定查询结果是否过时并自动驱逐过时的查询。

    清除缓存: SessionFactory 上的evictQueries() 方法可用于手动驱逐查询缓存。

    缓存的内容:查询及其结果

    默认开启:

    开启/关闭:在休眠配置中开启/关闭

    有用信息:查询缓存仅缓存实体 ID。必须与二级缓存配合使用才能实现true(无DB访问)缓存。

    【讨论】:

      【解决方案2】:

      补充/更正:

      (在 2L 缓存中)生命周期/范围:我相信这是绑定到 EntityManagerFactory/SessionFactory。不知道旧数据什么时候被清除。

      此缓存被委托给专门的缓存提供程序,例如 Infinispan 或 EhCache。因此,驱逐由您配置/请求,但由缓存提供程序执行。

      (在 2L 缓存中)缓存的内容:所有内容

      您需要明确告诉 Hibernate 您要缓存哪些实体。

      (查询缓存)总结:这是另一个可以启用的二级缓存(通常是为了尝试提高性能)。

      查询缓存是存储查询、查询参数和结果的缓存。如果查询和查询参数相同,则可以预期结果相同。当然,还有缓存失效技术,例如“如果表 X 被此更新触及,则使缓存失效”,这样缓存就不会过时。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 2013-04-13
        • 2016-08-13
        • 2012-04-29
        • 2015-01-05
        • 2011-11-18
        • 2017-01-16
        相关资源
        最近更新 更多