隔离级别缓存
简介: 该高速缓存有时并不是真正的高速缓存。但是,为了实现某些隔离级别,数据库本身可能会缓存某些查询结果。
生命周期/范围: 此缓存的作用域为单个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。它必须与第二级缓存一起使用,以实现 真正的 (无数据库访问)缓存。



