Hibernate 休眠缓存引用

Hibernate 休眠缓存引用,hibernate,caching,jpa,Hibernate,Caching,Jpa,我正在寻找一个简单、完整、简洁的缓存列表,您将在使用Hibernate编写JPA时遇到这些缓存 特别是,我想知道每个缓存的生命周期(缓存何时过期)、缓存的范围、清除缓存的方法(如果有)、缓存的内容、默认情况下是否打开缓存、如何打开/关闭缓存以及任何有用的信息 我试图在另一个问题中找到这些信息,但找不到任何完整的答案。答案也分布在Hibernate文档中,但我也很难在那里找到它们 我计划作为一个社区维基来回答这个问题,但我仍然不知道所有的答案,所以会有一些漏洞需要填补。隔离级别缓存 摘要:此缓存有

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

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

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

我计划作为一个社区维基来回答这个问题,但我仍然不知道所有的答案,所以会有一些漏洞需要填补。

隔离级别缓存 摘要:此缓存有时不是真正的缓存。但是,为了实现某些隔离级别,数据库本身可能正在缓存一些查询结果

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

清除缓存:除了启动新事务,我不知道还有什么其他方法

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

默认打开:取决于来自数据库的默认隔离级别。默认情况下,MySQL附带可重复读取隔离,因此是的,MySQL默认启用此选项

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

有用信息:Hibernate/JPA除了指定所需的隔离级别之外,实际上无法控制此缓存的操作

会话级(第一级)缓存 摘要:此缓存是EntityManager/会话缓存。我相信这也是所谓的持久性上下文

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

清除缓存:在EntityManager或会话上调用
clear()
将清除整个缓存。在会话上调用
execute()
,将从缓存中清除单个对象

缓存的内容:所有内容

默认打开:

打开/关闭:无法关闭

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

二级缓存 摘要:这是一个可以启用的辅助缓存(通常用于尝试提高性能)

生命周期/范围:我相信这与EntityManagerFactory/SessionFactory有关。此缓存的自动逐出取决于缓存策略。在只读策略中,数据永远不会自动逐出。在读写或诺斯特里克读写策略中,会话关闭时数据将被逐出对此没有100%的把握。

清除缓存:您可以调用
getCache().execute(class)
来逐出特定的类,调用
getCache().executeAll()
来逐出整个缓存。这些方法位于EntityManagerFactory上

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

默认打开:

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

有用信息:

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

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

清除缓存:可以使用SessionFactory上的
executeQueries()
方法手动退出查询缓存

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

默认打开:

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

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

添加/更正:

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

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

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

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

(查询缓存)摘要:这是另一个可以启用的辅助缓存(通常用于尝试提高性能)

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