隔离级别缓存
总结:这个缓存有时并不真正称为缓存。但是,为了实现某些隔离级别,数据库本身可能会缓存一些查询结果。
生命周期/范围:此缓存的范围为单个 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访问)缓存。