更新时间:2022-02-11 10:56:06 来源:极悦 浏览586次
缓存是一种提高系统性能的机制。它是位于应用程序和数据库之间的缓冲存储器。高速缓存存储最近使用的数据项,以尽可能减少数据库命中的次数。
缓存对 Hibernate 也很重要。它使用多级缓存方案,如下所述
一级缓存是Session缓存,是所有请求都必须通过的强制缓存。Session 对象在将对象提交到数据库之前将其保持在自己的权力之下。
如果您对一个对象发出多个更新,Hibernate 会尝试尽可能长时间地延迟执行更新,以减少发出的更新 SQL 语句的数量。如果您关闭会话,所有正在缓存的对象都将丢失,并在数据库中保留或更新。
二级缓存是可选的缓存,在尝试定位二级缓存中的对象之前,将始终参考一级缓存。二级缓存可以基于每个类和每个集合进行配置,主要负责跨会话缓存对象。
任何第三方缓存都可以与 Hibernate 一起使用。提供了一个org.hibernate.cache.CacheProvider接口,必须实现该接口才能为 Hibernate 提供缓存实现的句柄。
Hibernate 还实现了与二级缓存紧密集成的查询结果集缓存。
这是一个可选功能,需要两个额外的物理缓存区域来保存缓存的查询结果和上次更新表时的时间戳。这仅对使用相同参数频繁运行的查询有用。
Hibernate默认使用一级缓存,你不用做一级缓存。让我们直接进入可选的二级缓存。并非所有类都能从缓存中受益,因此能够禁用二级缓存很重要。
Hibernate 二级缓存分两步设置。首先,您必须决定使用哪种并发策略。之后,您可以使用缓存提供程序配置缓存过期和物理缓存属性。
并发策略是一个中介,它负责将数据项存储在缓存中并从缓存中检索它们。如果要启用二级缓存,则必须为每个持久类和集合决定使用哪种缓存并发策略。
Transactional - 将此策略用于以读取为主的数据,在这种情况下,在极少数更新的情况下,防止并发事务中的陈旧数据至关重要。
Read-write - 再次将此策略用于以读取为主的数据,在这种情况下,在极少数更新的情况下,防止并发事务中的陈旧数据至关重要。
Nonstrict-read-write - 此策略无法保证缓存和数据库之间的一致性。如果数据几乎从未更改并且过时数据的可能性很小不是关键问题,则使用此策略。
只读- 适用于数据的并发策略,永远不会改变。仅将其用作参考数据。
如果我们要为Employee类使用二级缓存,让我们添加所需的映射元素,告诉 Hibernate 使用读写策略缓存 Employee 实例。
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name = "Employee" table = "EMPLOYEE">
<meta attribute = "class-description">
This class contains the employee detail.
</meta>
<cache usage = "read-write"/>
<id name = "id" type = "int" column = "id">
<generator class="native"/>
</id>
<property name = "firstName" column = "first_name" type = "string"/>
<property name = "lastName" column = "last_name" type = "string"/>
<property name = "salary" column = "salary" type = "int"/>
</class>
</hibernate-mapping>
usage="read-write" 属性告诉 Hibernate 对定义的缓存使用读写并发策略。
要使用查询缓存,您必须首先使用配置文件中的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 在缓存的员工区域中存储和查找查询。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习