我正在寻找一个简单,完整,简明的缓存列表,您将在使用Hibernate编码JPA时运行该缓存。
特别是,我想了解每个缓存的生命周期(缓存何时失效),缓存的范围,清除缓存的方式(如果有),缓存的内容(如果缓存是)。默认情况下处于打开状态,如何打开/关闭它以及任何有用的信息。
我试图在另一个问题中找到此信息,但找不到任何完整的答案。答案也遍布Hibernate文档,但是我也很难在那找到它们。
我计划自己作为社区Wiki回答这个问题,但我仍然不知道所有的答案,因此需要填补一些空白。
简介: 该高速缓存有时并不是真正的高速缓存。但是,为了实现某些隔离级别,数据库本身可能会缓存某些查询结果。
生命周期/范围: 此缓存的作用域为单个Session / EntityManager。生命周期绑定到事务生命周期。
清除缓存: 除了开始新事务外,我无所不知
缓存内容: 查询和结果(如果隔离处于可重复读取或可序列化级别)
默认情况下为“开”: 取决于数据库的默认隔离级别。默认情况下,MySQL附带可重复的读取隔离,所以是的,默认情况下,MySQL处于启用状态。
打开/关闭: 可以在创建事务时指定。也可以通过更改数据库的默认值来更改。
有用的信息: 除了指定所需的隔离级别之外,Hibernate / JPA实际上对该缓存的操作没有任何控制权。
摘要: 此缓存是EntityManager / Session缓存。我相信这也是所谓的持久性上下文。
清除缓存: 调用clear()EntityManager或Session会清除整个缓存。调用evict()Session会从缓存中清除单个对象。
clear()
evict()
缓存内容: 所有内容
默认为开启: 是
开启/关闭: 无法关闭
有用的信息: 每当flush()调用该高速缓存时,它就会与数据库合并。除非发生这种情况,否则其他事务将无法看到此缓存中的内容。保证a的最佳方法flush()是提交事务。
flush()
简介: 这是可以启用的辅助缓存(通常用于尝试并提高性能)。
生命周期/范围: 我相信这绑定到EntityManagerFactory / SessionFactory。此缓存的自动驱逐取决于缓存策略。在只读策略中,永远不会自动清除数据。在读写或无限制读写策略中,会话关闭时将清除数据。 不能100%确定这一点。
清除缓存: 您可以调用getCache().evict(class)逐出特定的类并getCache().evictAll()逐出整个缓存。这些方法在EntityManagerFactory上。
getCache().evict(class)
getCache().evictAll()
缓存内容: 您明确配置应缓存的实体。
默认为开启: 否
开启/关闭: 在Hibernate配置中开启/关闭
有用的信息:
摘要: 查询缓存是一种存储查询,查询参数和结果的缓存。如果查询和查询参数相同,则可以预期结果相同。
生命周期/范围: 我不知道何时确定此缓存中的数据是陈旧的。我相信范围是在EntityManagerFactory / SessionFactory级别。另外,Hibernate保留了每个表的“ Hibernate的最新更新”时间戳的列表。Hibernate使用这些时间戳来确定查询结果是否是陈旧的,并自动退出陈旧的查询。
清除缓存: 将evictQueries()在会话工厂方法可用于手动逐出查询缓存。
evictQueries()
缓存内容: 查询及其结果
有用的信息: 查询缓存仅缓存实体ID。它必须与第二级缓存一起使用,以实现 真正的 (无数据库访问)缓存。