- 浏览: 82355 次
- 性别:
- 来自: 上海
文章分类
最新评论
查询缓存是针对普通属性结果集的缓存,对实体对象的结果集只缓存id
查询缓存的生命周期,当前关联的表发生修改,那么查询缓存生命周期结束
查询缓存的配置和使用:
* 在hibernate.cfg.xml文件中启用查询缓存,如:
<property name="hibernate.cache.use_query_cache">true</property>
* 在程序中必须手动启用查询缓存,如:
query.setCacheable(true);
查询缓存的生命周期和session无关
查询缓存只对query.list()起作用,query.iterate不起作用,也就是query.iterate不使用查询缓存
查询缓存的生命周期,当前关联的表发生修改,那么查询缓存生命周期结束
查询缓存的配置和使用:
* 在hibernate.cfg.xml文件中启用查询缓存,如:
<property name="hibernate.cache.use_query_cache">true</property>
* 在程序中必须手动启用查询缓存,如:
query.setCacheable(true);
查询缓存的生命周期和session无关
查询缓存只对query.list()起作用,query.iterate不起作用,也就是query.iterate不使用查询缓存
public class CacheLevel2Test extends TestCase { /** * 开启查询缓存,关闭二级缓存 * * 开启一个session,分别调用query.list */ public void testCache1() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); Query query = session.createQuery("select s.name from Student s"); //启用查询查询缓存 query.setCacheable(true); List names = query.list(); for (Iterator iter=names.iterator();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); //没有发出查询sql,因为启用了查询缓存 names = query.list(); for (Iterator iter=names.iterator();iter.hasNext(); ) { String name = (String)iter.next(); System.out.println(name); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } /** * 开启查询缓存,关闭二级缓存 * * 开启两个session,分别调用query.list */ public void testCache2() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); Query query = session.createQuery("select s.name from Student s"); //启用查询查询缓存 query.setCacheable(true); List names = query.list(); for (Iterator iter=names.iterator();iter.hasNext(); ) { String name = (String)iter.next(); System.out.println(name); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } System.out.println("-------------------------------------"); try { session = HibernateUtils.getSession(); session.beginTransaction(); Query query = session.createQuery("select s.name from Student s"); //启用查询查询缓存 query.setCacheable(true); //不会发出查询sql,因为查询缓存的生命周期和session无关 List names = query.list(); for (Iterator iter=names.iterator();iter.hasNext(); ) { String name = (String)iter.next(); System.out.println(name); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } /** * 开启查询缓存,关闭二级缓存 * * 开启两个session,分别调用query.iterate */ public void testCache3() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); 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.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } System.out.println("-------------------------------------"); try { session = HibernateUtils.getSession(); session.beginTransaction(); Query query = session.createQuery("select s.name from Student s"); //启用查询查询缓存 query.setCacheable(true); //查询缓存只对query.list()起作用,query.iterate不起作用,也就是query.iterate不使用 //查询缓存 for (Iterator iter=query.iterate();iter.hasNext(); ) { String name = (String)iter.next(); System.out.println(name); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } /** * 关闭查询缓存,关闭二级缓存 * * 开启两个session,分别调用query.list查询实体对象 */ public void testCache4() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); Query query = session.createQuery("select s from Student s"); //启用查询查询缓存 //query.setCacheable(true); List students = query.list(); for (Iterator iter=students.iterator();iter.hasNext(); ) { Student student = (Student)iter.next(); System.out.println(student.getName()); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } System.out.println("-------------------------------------"); try { session = HibernateUtils.getSession(); session.beginTransaction(); Query query = session.createQuery("select s from Student s"); //启用查询查询缓存 //query.setCacheable(true); //会发出查询sql,因为list默认每次都会发出查询sql List students = query.list(); for (Iterator iter=students.iterator();iter.hasNext(); ) { Student student = (Student)iter.next(); System.out.println(student.getName()); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } /** * 开启查询缓存,关闭二级缓存 * * 开启两个session,分别调用query.list查询实体对象 */ public void testCache5() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); Query query = session.createQuery("select s from Student s"); //启用查询查询缓存 query.setCacheable(true); List students = query.list(); for (Iterator iter=students.iterator();iter.hasNext(); ) { Student student = (Student)iter.next(); System.out.println(student.getName()); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } System.out.println("-------------------------------------"); try { session = HibernateUtils.getSession(); session.beginTransaction(); Query query = session.createQuery("select s from Student s"); //启用查询查询缓存 query.setCacheable(true); //会发出n条查询语句,因为开启了查询缓存,关闭了二级缓存,那么查询缓存会缓存实体对象的id //所以hibernate会根据实体对象的id去查询相应的实体,如果缓存中不存在相应的 //实体那么将发出根据实体id查询的sql语句,否则不会发出sql使用缓存中的数据 List students = query.list(); for (Iterator iter=students.iterator();iter.hasNext(); ) { Student student = (Student)iter.next(); System.out.println(student.getName()); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } /** * 开启查询缓存,开启二级缓存 * * 开启两个session,分别调用query.list查询实体对象 */ public void testCache6() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); Query query = session.createQuery("select s from Student s"); //启用查询查询缓存 query.setCacheable(true); List students = query.list(); for (Iterator iter=students.iterator();iter.hasNext(); ) { Student student = (Student)iter.next(); System.out.println(student.getName()); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } System.out.println("-------------------------------------"); try { session = HibernateUtils.getSession(); session.beginTransaction(); Query query = session.createQuery("select s from Student s"); //启用查询查询缓存 query.setCacheable(true); //不会发出查询sql,因为开启了二级缓存和查询缓存,查询缓存缓存了实体对象的id列表 //hibernate会根据实体对象的id列表到二级缓存中取得相应的数据 List students = query.list(); for (Iterator iter=students.iterator();iter.hasNext(); ) { Student student = (Student)iter.next(); System.out.println(student.getName()); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } }
发表评论
-
Fetch抓取策略
2008-12-21 15:30 10251 hibernate抓取策略(单端代理的批量抓取) 保持默 ... -
二级缓存
2008-12-21 09:55 802二级缓存也称进程级的缓存或SessionFactory级的缓存 ... -
一级缓存
2008-12-20 21:18 825一级缓存很短和session的生命周期一致,一级缓存也叫ses ... -
HQL 原生SQL查询 外置命名查询 查询过滤器 DML风格的查询
2008-12-20 15:04 1269在hql中关键字不区分大小写,但是属性和类名区分大小写 1、简 ... -
冬夜读书示子律
2008-12-19 16:11 779古人学问无遗力,少壮功夫老始成。 纸上得来终觉浅,绝知此事要躬 ... -
悲观锁与乐观锁
2008-12-19 15:49 735悲观锁 悲观锁的实现,通常依赖于数据库机制,在整个过程中将数据 ... -
Set Map Arrary List 集合映射
2008-12-19 14:50 829<class name="com.bjsxt. ... -
composite 映射
2008-12-19 10:48 748通常将复合主键相关的属性,单独放到一个类中 * 此类必须实现序 ... -
Component 映射
2008-12-19 09:54 657在hibernate中,component是某个实体的逻辑组成 ... -
继承映射
2008-12-18 21:05 832继承映射分为三种: 1 单表继承:每颗类继承树使用一个表(ta ... -
LAZY策略
2008-12-18 14:26 719hibernate lazy策略可以使用在: * <cl ... -
Many-to-Many
2008-12-18 10:36 761hibernate多对多关联映射(单向User----> ... -
one-to-many
2008-12-17 20:19 1036hihernate一对多关联映射 ... -
session --------- flush() 和 evict()
2008-12-17 14:00 2249session flush方法主要做了 ... -
数据库隔离级别
2008-12-17 13:57 793隔离级别 脏读 不可重复读 幻读 R ... -
One-to-one( 2 唯一外键关联)
2008-12-17 11:12 892hibernate一对一唯一外键关联映射(单向关联Person ... -
one-to-one(1主键关联)
2008-12-16 20:23 1744主键关联-----单向 <class name=&qu ... -
many-to-one
2008-12-16 20:15 731<class name="com.bjsx ... -
Hibernate3包问题org/slf4j/impl/StaticLoggerBinder
2008-12-15 13:55 4240Exception in thread "main& ...
相关推荐
Hibernate一级缓存、二级缓存以及查询缓存实例
本代码通过使用spring aop+ehcache的技术,实现了方法级别的查询缓存,主要原理是 方法的完整路径+方法参数值,作为key,放入cache中,下次访问时先判断cache中是否有该key.
7:Hibernate查询缓存Query Cache及实现
PHP查询缓存
而查询缓存是语义缓存的一种,在 SQL解析与查询执行之间,通过研究查询缓存的自主管理来提高数据库的查询性能。首先介绍了数据库常用的语义缓存与自主计算,然后对查询缓存进行了形式化定义,并提出了自适应的查询...
NULL 博文链接:https://cdxs2.iteye.com/blog/1936594
MySQL的查询缓存并非缓存执行计划,而是查询及其结果集,这就意味着只有相同的查询操作才能命中缓存,因此MySQL的查询缓存命中率很低,另一方面,对于大结果集的查询,其查询结果可以从cache中直接读取,有效的提升...
hibernate查询缓存1
您可能感兴趣的文章:MySQL优化之缓存优化mysql的查询缓存说明使用Memcache缓存mysql数据库操作的原理和缓存过程浅析浅析MySQL内存的使用说明(全局缓存+线程缓存)MySQL高速缓存启动方法及参数详解(query_cache_...
提高MySql查询性能 - 打开和设置查询缓存 视频教程 京华志&精华志出品 希望大家互相学习,互相进步 支持CSDN 支持微软 主要包括C# ASP.NET SQLDBA 源码 毕业设计 开题报告 答辩PPT等等好多知识
在使用中,查询缓存会存储一个 SELECT 查询的文本与被传送到客户端的相应结果。 如果之后接收到一个同样的查询,服务器将从查询缓存中检索结果,而不是再次分析和执行这个同样的查询。 注意:查询缓存绝不返回过期...
最快查询缓存Jedis配置
Hibernate查询缓存及实现.PPT
MySQL缓存机制简单的说就是缓存sql文本及查询结果,如果运行...显然,这对于频繁更新的表,查询缓存是不适合的,而对于一些不常改变数据且有 大量相同sql查询的表,查询缓存会节约很大的性能。 命中条件 缓存存在一个
提出了基于XML Database的网格数据库物化查询缓存机制,提高用户查询的速度,均衡网格负载。定义了网格数据库服务质量与数据质量的标准,提出了物化查询选择算法MQS,为用户提供更好的数据服务。
值得记住的是Laravel 5查询缓存 值得记住的是Laravel的口才,它增加了Remember remember()查询方法。 这使得在可调整的时间内缓存查询结果非常容易。 // Get a the first user's posts and remember them for a ...
如何对查询缓存进行维护和调优[文].pdf