Hibernate缓存——查询缓存
默认情况下关闭设置的缓存对HQL和QBC查询时无效,需要打开查询缓存。
查询缓存依赖于二级缓存。
1.设置
<propertyname="hibernate.cache.use_query_cache">
true
</property>
2.在打开了查询缓存之后,需要注意,调用query.list()操作之前,必须显式调用query.setCachable(true)来标识某个查询使用缓存。
public void testQuery() {
Queryquery = session.createQuery("from Emp");
query.setCacheable(true);
Listlist = query.list();
System.out.println(list);
Listlist2 = query.list();
System.out.println(list2);
}
时间戳缓存区域:
时间戳缓存区域存放了对于查询结果相关的表进行插入,删除或更新操作的时间戳。
Hibernate通过时间戳缓存区域来判断被缓存的查询结果是否过期,过程如下:
T1时刻执行查询操作,把查询结果放在QueryCache区域,记录该区域的时间戳为T1
T2时刻对查询结果相关的表进行更新操作,hibernate把T2时刻存放在UpdateTimestampCache区域
T3时刻执行查询前,比较T1,T2,如果T1>T2,直接从QueryCache区域获取查询结果,如果T2>T1,丢弃QueryCache数据,重新查询数据库,将数据放入QueryCache区域
Query query = session.createQuery("from Emp");
query.setCacheable(true);
Listlist = query.list();
System.out.println(list);
Empemp = (Emp)session.get(Emp.class, 1);
emp.setOrderName("rrr");
Listlist2 = query.list();
System.out.println(list2);