📅  最后修改于: 2020-11-16 07:03:28             🧑  作者: Mango
缓存是一种增强系统性能的机制。它是位于应用程序和数据库之间的缓冲存储器。高速缓存存储器存储最近使用的数据项,以尽可能减少数据库命中的次数。
缓存对休眠也很重要。它利用了如下所示的多级缓存方案-
一级缓存是会话缓存,它是所有请求都必须经过的强制性缓存。在将对象提交到数据库之前,Session对象将自己保持在自己的能力之下。
如果对一个对象发出多个更新,则Hibernate会尝试尽可能延迟进行更新,以减少发出的更新SQL语句的数量。如果关闭会话,则所有正在缓存的对象都将丢失,并在数据库中保留或更新。
第二级高速缓存是可选的高速缓存,在尝试在第二级高速缓存中定位对象之前,将始终咨询第一级高速缓存。二级缓存可以基于每个类和每个集合进行配置,并且主要负责跨会话缓存对象。
Hibernate可以使用任何第三方缓存。提供了org.hibernate.cache.CacheProvider接口,必须实现该接口才能为Hibernate提供缓存实现的句柄。
Hibernate还为查询结果集实现了一个缓存,该缓存与第二级缓存紧密集成。
这是一项可选功能,并且需要两个额外的物理缓存区域,这些区域保存缓存的查询结果和上次更新表的时间戳。这仅对使用相同参数频繁运行的查询有用。
默认情况下,Hibernate使用一级缓存,而您无需使用一级缓存。让我们直接进入可选的二级缓存。并非所有类都受益于缓存,因此能够禁用二级缓存很重要。
Hibernate二级缓存的设置分为两个步骤。首先,您必须决定使用哪种并发策略。之后,您可以使用缓存提供程序配置缓存过期和物理缓存属性。
并发策略是中介程序,它负责将数据项存储在缓存中并从缓存中检索它们。如果要启用二级缓存,则必须为每个持久性类和集合决定要使用的缓存并发策略。
事务性-对于很少读取的更新,在防止并发事务中过时的数据非常重要的情况下,可对大多数只读数据使用此策略。
读写-对于罕见的更新,在防止并发事务中过时的数据至关重要的情况下,再次对大多数只读数据使用此策略。
非严格读写-此策略无法保证缓存和数据库之间的一致性。如果数据几乎没有变化并且陈旧数据的可能性很小,则不必使用此策略。
只读-适用于数据的并发策略,该策略永远不变。仅用于参考数据。
如果我们要对Employee类使用二级缓存,让我们添加必要的映射元素,以告知Hibernate使用读写策略缓存Employee实例。
This class contains the employee detail.
Usage =“ read-write”属性告诉Hibernate对定义的缓存使用读写并发策略。
在考虑了并发策略之后的下一步,将使用缓存候选类来选择一个缓存提供程序。 Hibernate强制您为整个应用程序选择单个缓存提供程序。
Sr.No. | Cache Name & Description |
---|---|
1 |
EHCache It can cache in memory or on disk and clustered caching and it supports the optional Hibernate query result cache. |
2 |
OSCache Supports caching to memory and disk in a single JVM with a rich set of expiration policies and query cache support. |
3 |
warmCache A cluster cache based on JGroups. It uses clustered invalidation, but doesn’t support the Hibernate query cache. |
4 |
JBoss Cache A fully transactional replicated clustered cache also based on the JGroups multicast library. It supports replication or invalidation, synchronous or asynchronous communication, and optimistic and pessimistic locking. The Hibernate query cache is supported. |
每个缓存提供程序都不与每种并发策略兼容。以下兼容性矩阵将帮助您选择适当的组合。
Strategy/Provider | Read-only | Nonstrictread-write | Read-write | Transactional |
---|---|---|---|---|
EHCache | X | X | X | |
OSCache | X | X | X | |
SwarmCache | X | X | ||
JBoss Cache | X | X |
您将在hibernate.cfg.xml配置文件中指定一个缓存提供程序。我们选择EHCache作为我们的二级缓存提供者-
org.hibernate.dialect.MySQLDialect
com.mysql.jdbc.Driver
jdbc:mysql://localhost/test
root
root123
org.hibernate.cache.EhCacheProvider
现在,您需要指定缓存区域的属性。 EHCache具有自己的配置文件ehcache.xml ,该文件应位于应用程序的CLASSPATH中。 ehcache.xml中用于Employee类的缓存配置可能看起来像这样-
就是这样,现在我们为Employee类和Hibernate启用了二级缓存,无论何时导航到Employee或按标识符加载Employee时,它都会命中二级缓存。
您应该分析所有类,并为每个类选择适当的缓存策略。有时,二级缓存可能会降低应用程序的性能。因此,建议先对应用程序进行基准测试,而不启用缓存,然后再启用非常合适的缓存并检查性能。如果缓存不能改善系统性能,则没有必要启用任何类型的缓存。
要使用查询缓存,必须首先使用配置文件中的hibernate.cache.use_query_cache =“ true”属性将其激活。通过将此属性设置为true,可以使Hibernate在内存中创建必要的缓存来保存查询和标识符集。
接下来,要使用查询缓存,请使用Query类的setCacheable(Boolean)方法。例如-
Session session = SessionFactory.openSession();
Query query = session.createQuery("FROM EMPLOYEE");
query.setCacheable(true);
List users = query.list();
SessionFactory.closeSession();
Hibernate还通过缓存区域的概念支持非常细粒度的缓存支持。高速缓存区域是已命名的高速缓存的一部分。
Session session = SessionFactory.openSession();
Query query = session.createQuery("FROM EMPLOYEE");
query.setCacheable(true);
query.setCacheRegion("employee");
List users = query.list();
SessionFactory.closeSession();
这段代码使用该方法来告诉Hibernate在缓存的雇员区域中存储并查找查询。