hibernate查询缓存(hibernate默认是关闭的)
查询缓存是针对普通属性结果集的缓存
对实体对象的结果集只缓存id
查询缓存的生命周期,当前关联的表发生修改,那么查询缓存生命周期结束
查询缓存的配置和使用:
1. 启用查询缓存:在hibernate.cfg.xml中加入:
<property name=”hibernate.cache.use_query_cache”>true</property>
2. 在程序中必须手动启用查询缓存,如:query.setCacheable(true);
测试查询缓存:
一. 开启查询缓存,关闭二级缓存,开启一个session,分别调用query.list (查询属性)
Query query = session.createQuery(“select s.name from Student s”);
//启用查询缓存
query.setCacheable(true);
List names = query.list();
for(Iterator iter = names.terator();iter.hasNext();){
String name = (String)iter.next();
System.out.println(name);
}
System.out.println(“------------------------------------------”);
query = session.createQuery(“select s.name from Student s”);
//启用查询缓存
query.setCacheable(true);
names = query.list();
for(Iterator iter = names.terator();iter.hasNext();){
String name = (String)iter.next();
System.out.println(name);
}
第二次没有去查询数据库,因为启用了查询缓存
二. 开启查询缓存,关闭二级缓存,开启两个session,分别调用query.list (查询属性)
Query query = session.createQuery(“select s.name from Student s”);
//启用查询缓存
query.setCacheable(true);
List names = query.list();
for(Iterator iter = names.terator();iter.hasNext();){
String name = (String)iter.next();
System.out.println(name);
}
session.close();
System.out.println(“------------------------------------------”);
………
Query query = session.createQuery(“select s.name from Student s”);
//启用查询缓存
query.setCacheable(true);
List names = query.list();
for(Iterator iter = names.terator();iter.hasNext();){
String name = (String)iter.next();
System.out.println(name);
}
第二次没有去查询数据库,因为查询缓存生命周期与session生命周期无关
三. 开启查询缓存,关闭二级缓存,开启两个session,分别调用query.iterate (查询属性)
Query query = session.createQuery(“select s.name from Student s”);
//启用查询缓存
query.setCacheable(true);
for(Iterator iter =query.iterate();iter.hasNext();){
String name = (String)iter.next();
System.out.println(name);
}
session.close();
System.out.println(“------------------------------------------”);
………
Query query = session.createQuery(“select s.name from Student s”);
//启用查询缓存
query.setCacheable(true);
for(Iterator iter = query.iterate();iter.hasNext();){
String name = (String)iter.next();
System.out.println(name);
}
第二去查询数据库,因为查询缓存只对query.list()起作用,对query.iterate()不起作用,也就是说query.iterate()不使用查询缓存
四. 关闭查询缓存,关闭二级缓存,开启两个session,分别调用query.list (查询实体对象)
Query query = session.createQuery(“ from Student s”);
//query.setCacheable(true);
List students = query.list();
for(Iterator iter = students.iterate();iter.hasNext();){
Student stu = (Student)iter.next();
System.out.println(stu.getName());
}
session.close();
System.out.println(“------------------------------------------”);
………
Query query = session.createQuery(“ from Student s”);
//query.setCacheable(true);
List students = query.list();
for(Iterator iter = students.iterate();iter.hasNext();){
Student stu = (Student)iter.next();
System.out.println(stu.getName());
}
第二去查询数据库,因为list默认每次都会发出查询sql
五. 开启查询缓存,关闭二级缓存,开启两个session,分别调用query.list (查询实体对象)
Query query = session.createQuery(“ from Student s”);
query.setCacheable(true);
List students = query.list();
for(Iterator iter = students.iterate();iter.hasNext();){
Student stu = (Student)iter.next();
System.out.println(stu.getName());
}
session.close();
System.out.println(“------------------------------------------”);
………
Query query = session.createQuery(“ from Student s”);
query.setCacheable(true);
List students = query.list();
for(Iterator iter = students.iterate();iter.hasNext();){
Student stu = (Student)iter.next();
System.out.println(stu.getName());
}
第二去查询数据库时,会发出N条sql语句,因为开启了查询缓存,关闭了二级缓存,那么查询缓存会缓存实体对象的id,所以hibernate会根据实体对象的id去查询相应的实体,如果缓存中不存在相应的实体,那么将发出根据实体id查询的sql语句,否则不会发出sql,使用缓存中的数据
六. 开启查询缓存,开启二级缓存,开启两个session,分别调用query.list (查询实体对象)
Query query = session.createQuery(“ from Student s”);
query.setCacheable(true);
List students = query.list();
for(Iterator iter = students.iterate();iter.hasNext();){
Student stu = (Student)iter.next();
System.out.println(stu.getName());
}
session.close();
System.out.println(“------------------------------------------”);
………
Query query = session.createQuery(“ from Student s”);
query.setCacheable(true);
List students = query.list();
for(Iterator iter = students.iterate();iter.hasNext();){
Student stu = (Student)iter.next();
System.out.println(stu.getName());
}
第二不会发出sql,因为开启了二级缓存和查询缓存,查询缓存缓存了实体对象的id列表,hibernate会根据实体对象的id列表到二级缓存中取得相应的数据
转自:http://www.blogjava.net/lsbwahaha/archive/2009/04/06/264084.html
分享到:
相关推荐
7:Hibernate查询缓存Query Cache及实现
hibernate查询缓存1
Hibernate查询缓存及实现.PPT
Hibernate一级缓存、二级缓存以及查询缓存实例
主要介绍了hibernate查询缓存详细分析,包括查询缓存配置方法及关闭二级缓存的详细介绍,需要的朋友参考下本文吧
QueryCache 用来缓存查询语句 , 及查询结果集中对象的 Identifier 与 Type. 当再次使用已缓存的 Query 时 , 就可以通过对象的 Identifier 与 Type 在 SECOND LEVEL CACHE 中查找实际的对象 . 对于查询缓存来说,...
Hibernate查询首先介绍get()和load()方法的区别:get()方法和load()方法的区别主要在于对二级缓存的使用上。load()方法会使用二级缓存,而get()方法在一级缓存没有找到会直接查询数据库,不会去二级缓存中查找。 get...
首先说下Hibernate缓存的作用(即为什么要用缓存机制),然后再具体说说Hibernate中缓存的分类情况,最后可以举个具体的例子。 Hibernate缓存的作用: Hibernate是一个持久层框架
hibernate缓存机制 hibernate缓存机制 hibernate缓存机制
Hibernate二级缓存Hibernate二级缓存Hibernate二级缓存Hibernate二级缓存Hibernate二级缓存
深入理解hibernate缓存,不再惧怕hibernate缓存...
hibernate 二级缓存详解hibernate 二级缓存详解hibernate 二级缓存详解hibernate 二级缓存详解hibernate 二级缓存详解hibernate 二级缓存详解hibernate 二级缓存详解hibernate 二级缓存详解hibernate 二级缓存详解
Hibernate是一种面向Java环境的ORM工具。系统地分析了Hibernate的缓存结构,并描述了二级缓存的查询过程、缓存策略;同时总结了二级缓存使用中的一些限制,以及使用二级缓存的优化策略。
管理Hibernate的缓存缓存 管理Hibernate的缓存缓存
hibernate的缓存机制和session对象的产生方式案例,里面写到session的两种产生方式,和hibernate的缓存机制:一级缓存、二级缓存、查询缓存
hibernate一级缓存和二级缓存的区别与联系
Hibernate缓存.docHibernate缓存.doc
Hibernate缓存原理及调优策略 Hibernate缓存原理调优策略
NULL 博文链接:https://cdxs2.iteye.com/blog/1936594
Hibernate缓存,性能优化