HazelCast的最大功能之一就是对hibernate二级缓存的支持 。
JPA具有两个级别的缓存。
一级缓存在事务期间缓存对象的状态。 通过查询相同的对象两次,您必须获得第一次获取的对象。
但是,在包含您检索到的对象并访问数据库的复杂查询的情况下,结果可能会不同步,因为结果不会反映您在事务处理期间应用于内存中对象的更改。 但是,您可以使用flush()解决此问题。 启动JPA会话后,其第一级缓存将限制为该会话,它将不会影响其他会话。 一级缓存是JPA的一部分
与第一级缓存相反,第二级缓存与会话工厂关联,因此第二级缓存在会话之间共享。 常用数据可以存储在内存中并可以更快地检索。
启用第二级缓存后,休眠将在休眠区域中缓存检索到的实体。 为此,您必须将实体设置为可缓存。 在幕后,驻留在实体中的信息以脱水格式缓存。
Hazelcast可以在两种形式的体系结构中与二级缓存一起使用。
客户端服务器或仅群集的体系结构。
首先,我们将研究仅集群体系结构。 Hazelcast为每个Hibernate缓存区域创建一个单独的分布式映射,因此是一个实体。 您可以通过Hazelcast映射配置轻松配置这些区域。该区域的名称具有相应的hazelcast映射。 例如,我们的实体之一称为用户,完整的包路径为“ com.gkatzioura.User”,那么我们的榛树广播将名为“ com.gkatzioura.User”。 假设此地图分布在所有hazelcast节点上,则从一个节点检索到实体后,缓存的信息将与其他hazelcast节点共享。 一旦实体在节点中更新,则缓存的信息将在其他节点中失效。
Hibernate还为我们提供了查询缓存。 查询缓存是缓存查询结果的缓存。 例如,在jpql查询的情况下
SELECT usr.username,usr.firstname FROM User usr
缓存的结果将是一个具有由查询和参数组成的键的映射
以及检索结果的值。 在先前的缓存中,检索到的数据是原始值,它们按原样存储。
但是,在某些情况下查询可能会检索实体。
例如
SELECT c FROM Customer c
在这种情况下,不是存储所有检索到的信息,而是检索实体并将其缓存在第二级缓存中,而查询缓存具有使用查询及其参数作为键并将实体id作为值的条目。
一旦再次发出相同的查询,查询缓存将获取ID,并将在第二级缓存中查找对应的实体。 如果第二级缓存中不存在实体,则发出查询以获取丢失的实体。
当涉及二级缓存和查询缓存的配置时,我们需要注意二级缓存和查询缓存的逐出机制。 在将ID高速缓存在查询高速缓存中的情况下,您可能会感到迷惑,但是从第二级高速缓存中逐出了它们对应的实体。 在这种情况下,性能会受到影响,因为休眠将为每个丢失的实体发出查询。
Hazelcast支持二级缓存,但是它是节点本地的,并且从未在Hazelcast群集中分布。
尽管从查询中获取的结果仍保留在特定节点上,但应从用作第二级缓存的分布式映射中检索从缓存的查询指定的实体。
到目前为止,这是我们需要的理论。 在下一个博客中,我们执行一些spring数据jpa代码和一些hazelcast配置。
翻译自: https://www.javacodegeeks.com/2017/02/hibernate-caching-hazelcast-jpa-caching-basics.html