一尘不染

Hibernate缓存参考

hibernate

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

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

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

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


阅读 206

收藏
2020-06-20

共1个答案

一尘不染

隔离级别缓存

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

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

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

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

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

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

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

会话级别(1级)缓存

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

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

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

缓存内容: 所有内容

默认为开启:

开启/关闭: 无法关闭

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

2级缓存

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

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

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

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

默认为开启:

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

有用的信息:

查询缓存

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

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

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

缓存内容: 查询及其结果

默认为开启:

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

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

2020-06-20