当前位置: 首页 > 面试题库 >

Hibernate缓存参考

司寇高峯
2023-03-14
问题内容

我正在寻找一个简单,完整,简明的缓存列表,您将在使用Hibernate编码JPA时运行该缓存。

特别是,我想了解每个缓存的生命周期(缓存何时失效),缓存的范围,清除缓存的方式(如果有),缓存的内容(如果缓存是)。默认情况下处于打开状态,如何打开/关闭它以及任何有用的信息。

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

我计划自己作为社区Wiki回答这个问题,但我仍然不知道所有的答案,因此需要填补一些空白。


问题答案:

隔离级别缓存

简介: 该高速缓存有时并不是真正的高速缓存。但是,为了实现某些隔离级别,数据库本身可能会缓存某些查询结果。

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

清除缓存: 除了开始新事务外,我无所不知

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

默认情况下为“开”: 取决于数据库的默认隔离级别。默认情况下,MySQL附带可重复的读取隔离,所以是的,默认情况下,MySQL处于启用状态。

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

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

会话级别(1级)缓存

摘要: 此缓存是EntityManager / Session缓存。我相信这也是所谓的持久性上下文。

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

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

缓存内容: 所有内容

默认为开启:

开启/关闭: 无法关闭

有用的信息:
每当flush()调用该高速缓存时,它就会与数据库合并。除非发生这种情况,否则其他事务将无法看到此缓存中的内容。保证a的最佳html" target="_blank">方法flush()是提交事务。

2级缓存

简介: 这是可以启用的辅助缓存(通常用于尝试并提高性能)。

生命周期/范围: 我相信这绑定到EntityManagerFactory /
SessionFactory。此缓存的自动驱逐取决于缓存策略。在只读策略中,永远不会自动清除数据。在读写或无限制读写策略中,会话关闭时将清除数据。
不能100%确定这一点。

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

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

默认为开启:

开启/关闭: 在Hibernate配置中开启/关闭

有用的信息:

查询缓存

摘要: 查询缓存是一种存储查询,查询参数和结果的缓存。如果查询和查询参数相同,则可以预期结果相同。

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

清除缓存:evictQueries()在会话工厂方法可用于手动逐出查询缓存。

缓存内容: 查询及其结果

默认为开启:

开启/关闭: 在Hibernate配置中开启/关闭

有用的信息: 查询缓存仅缓存实体ID。它必须与第二级缓存一起使用,以实现 真正的 (无数据库访问)缓存。



 类似资料:
  • 问题内容: 我该如何决定使用哪个? , , , 。 我阅读了https://www.hibernate.org/hib_docs/v3/api/org/hibernate/cache/CacheConcurrencyStrategy.html,但没有足够详细地解释。 问题答案: 在Hibernate文档确实在他们定义了很好的工作: 19.2.2。策略:只读 如果您的应用程序需要读取而不是修改持久类

  • 问题内容: 我想在hibernate项目中使用二级缓存,但是我只对hibernate二级缓存了解一点,任何人都可以解释我应该如何在代码中使用它以及需要什么配置和.jar文件吗?我将这些设置设置为我的hibernate.cfg.xml文件 并添加这些jar文件, 我想知道我是否需要更改其他配置? 我怎么知道我的项目使用二级缓存? 如果只是设置此设置,hibernate将自动使用此设置,否则我必须在我

  • 主要内容:缓存,Hibernate 一级缓存,快照区Hibernate 是一款全自动 ORM 框架,它会在应用程序访问数据时,自动生成 SQL 语句并执行,因此开发人员不需要自己编写 SQL 语句,但这也造成它无法像 MyBatis 一样,能够直接从 SQL 层面严格控制其执行性能以及对数据库的访问频率,所以很容易出现性能不佳的情况。 为此,Hibernate 提供了多种性能优化手段(例如 HQL、懒加载策略、抓取策略以及缓存机制),其中缓存机制是

  • Employee.java

  • 从块生成代码时,经常会发现需要多次使用子块的返回值。考虑一个值块,该值块查找并返回列表的最后一个元素。该块本身将有一个输入(一个列表),并返回一个值(最后一个元素)。这是JavaScript的生成器: var code = arg0 + '[' + arg0 + '.length - 1]'; 如果arg0是变量名,则此生成器返回完全可接受的JavaScript: aList[aList.leng

  • 问题内容: 我正在开发hibernate+ ehcache程序。 ehcache.xml 我在bean.xml中提到了ehcache 我在dao类中的调用方法是 输出为: 但是它在数据库中命中了两次。我在代码中没有发现任何错误。请向我建议为什么它在数据库中命中了两次。 问题答案: 我已经解决了我的问题。我需要添加 在域类中。