打开cache后query的list和iterator方法区别

  将query 的cache打开的话,缓存的是query本身,以hql 生成的 sql ,再加上参数,分页等信息做为key值,而不是query的结果.query的结果是放在session的cache中,和query的cache是有区别的.

1、ehcache.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<!--
Subdirectories can be specified below the property e.g. java.io.tmpdir/one
-->
<diskStore path="java.io.tmpdir"/> <!--
Mandatory Default Cache configuration. These settings will be applied to caches
created programmtically using CacheManager.add(String cacheName)
-->
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/> <cache name="org.hibernate.cache.spi.UpdateTimestampsCache"
maxElementsInMemory="5000"
eternal="true"
overflowToDisk="true" />
<cache name="org.hibernate.cache.internal.StandardQueryCache"
maxElementsInMemory="10000"
eternal="false"
timeToLiveSeconds="120"
overflowToDisk="true" /> </ehcache>

2、applicationContext.xml配置sessionFactory

    <bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<!-- 是否打印sql -->
<prop key="hibernate.show_sql">true</prop>
<!-- 格式化sql
<prop key="hibernate.format_sql">true</prop>
-->
<!-- 配置二级缓存 -->
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
<prop key="hibernate.net.sf.ehcache.configurationResourceName">conf/ehcache.xml</prop>
<!-- 开启查询时的二级缓存 -->
<prop key="hibernate.cache.use_query_cache">true</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/db/entity/User.hbm.xml</value>
</list>
</property>
</bean>

测试案例:

一、打开query的cache后对list影响

1:

        String hql1="from User where id=3";
Query q1=session.createQuery(hql1);
q1.setCacheable(true);
q1.list();
System.out.println("***************************************");
String hql2="from User where id=3";
Query q2=session.createQuery(hql2);
q2.setCacheable(true);
q2.list();
session.close();

输出结果:

Hibernate: select user0_.id as id0_, user0_.name as name0_ from mydb.user user0_ where user0_.id=3
***************************************

结论:两个一样的query,第二个query会用query的cache,不在查询数据库

2:

        String hql1="from User where id<=3";
Query q1=session.createQuery(hql1);
q1.setCacheable(true);
q1.list();
System.out.println("***************************************");
String hql2="from User where id=3";
Query q2=session.createQuery(hql2);
q2.setCacheable(true);
q2.list();
session.close();

输出结果:

Hibernate: select user0_.id as id0_, user0_.name as name0_ from mydb.user user0_ where user0_.id<=3
***************************************
Hibernate: select user0_.id as id0_, user0_.name as name0_ from mydb.user user0_ where user0_.id=3

结论:从逻辑上将,第一个query查询出的值应该包含第二个query,但是第二个query不会用query的cache,而是会从新查询数据库.

3:

        String hql1="from User where id=?";
Query q1=session.createQuery(hql1).setInteger(0, 1);
q1.setCacheable(true);
q1.list();
System.out.println("***************************************");
String hql2="from User where id=?";
Query q2=session.createQuery(hql2).setInteger(0, 1);
q2.setCacheable(true);
q2.list();
session.close();

输出结果:

Hibernate: select user0_.id as id0_, user0_.name as name0_ from mydb.user user0_ where user0_.id=?
***************************************

结论:设置参数后的query是一样的,第二个query会用query的cache,不会重新查询数据库。如果设置参数后所对应的query不一样,则两个query不同,第二个query不会用query的cache,而是会从新查询数据库.

二、打开query的cache后对iterator影响

  query的cache不会缓存第一次针对ID的SQL,后面iterator的时候,会根据session中的cache决定数据库的访问.可以说query的cache对iterator没什么影响。

注意:

如果cache的是native SQL,两个query的sql 语句必须是一样的(包括大小写).如下面的例子会访问两次数据库.

        session.createSQLQuery("select * from user where id=1").list();
session.createSQLQuery("SELECT * from user where id=1").list();

输出结果:

Hibernate: select * from user where id=1
Hibernate: SELECT * from user where id=1

hibernate中Query的list和iterator区别(续)的更多相关文章

  1. hibernate中Query的list和iterator区别

    1.Test_query_list类 public class Test_query_iterator_list { public static void main(String[] args) { ...

  2. Hibernate中Query.list()方法报IllegalArgumentException异常

    最近在使用Hibernate开发项目,在写好hql语句,并初始化Query对象,执行Query.list()方法时,应用报IllegalArgumentException异常.经网上查询,现已经基本决 ...

  3. query 的list()和iterator()区别

    区别: 1.返回的类型不一样,list返回List,iterate返回iterator. 2.查询策略不同.(获取数据的方式不一样,list会直接查询数据库,iterate会先到数据库中获取id,然后 ...

  4. hibernate中load和get方法的区别

    1.读取时机不同(当lazy=true的时候)    load是采用延迟机制(load语句不读库,等使用非主键时才去读库),而get不采用延  迟机制(get语句时马上读库): 2.搜索不到数据时的情 ...

  5. 【hibernate】Hibernate中save, saveOrUpdate, persist, merge, update 区别

    Hibernate Save hibernate save()方法能够保存实体到数据库,正如方法名称save这个单词所表明的意思.我们能够在事务之外调用这个方法,这也是我不喜欢使用这个方法保存数据的原 ...

  6. hibernate 中 query.list()的优化

    2018年3月15日  今天做项目遇到一个需求,问题是在调用query.list()的时候,因为数据也多大概700条左右,查询一次需要30s+,这简直是不能忍,于是开始考虑怎么优化. 1.因为是单表查 ...

  7. hibernate中@Entity和@Table的区别

    Java Persistence API定义了一种定义,可以将常规的普通Java对象(有时被称作POJO)映射到数据库.这些普通Java对象被称作Entity Bean.除了是用Java Persis ...

  8. hibernate中load,get;find,iterator;merge,saveOrUpdate,lock的区别

    hibernate中load,get;find,iterator;merge,saveOrUpdate,lock的区别 转自http://www.blogjava.net/bnlovebn/archi ...

  9. Hibernate中的query.setFirstResult(),query.setMaxResults();

    一.query.scroll()和query.setFirstResult(),query.setMaxResults();这两种方法都可以取到一定范围内的数据,用来数据分页显示.那么两者区别,以及两 ...

随机推荐

  1. KeepAlived+Nginx实现高可用负载

    一.环境及安装版本: centos6.5.Nginx1.4.7.keepalived1.3.2 虚拟IP 真是IP Nginx端口 主从分配 10.0.90.215 10.0.90.217 80 MA ...

  2. WebApp开发总结

    WebApp开发总结 框架的使用网络上都有教程,就不写了,主要记录下个人的开发总结以方便以后开发注意. css公用样式统一定义 css样式抽出复用 appearance: none; 取消系统默认样式 ...

  3. 【Ganglia】集群监控系统搭建

    参考博客 www.cnblogs.com/atomicbomb/p/6726119.html 操作系统 centos7  机器两台 一. 配置软件环境 操作步骤: 使用yum安装方式安装所需基础依赖包 ...

  4. 【可视化】div背景半透明

    css实现元素半透明使用 opacity:0.x 实现背景色半透明:rgba(a,b,c,x); x为透明度0,到1

  5. IP地址 子网掩码 默认网关 DNS(转)

    突然被问到IP地址方面的知识,吓得我赶紧上网找一找资料,觉得这篇还是写得简单易懂,share一下. Key: 1.IP地址=网络地址+主机地址,(又称:主机号和网络号组成): 2.将IP地址和子网掩码 ...

  6. Educational Codeforces Round 27 补题

    题目链接:http://codeforces.com/contest/845 A. Chess Tourney 水题,排序之后判断第n个元素和n+1个元素是不是想等就可以了. #include < ...

  7. PHP导出excle图片与文字

    try { //CI框架引入PHPExcel $this->load->library('PHPExcel'); $objPHPExcel = new PHPExcel(); //图片处理 ...

  8. 两个大数相乘-Java

    两个字符串表示两个非常大的数,请设计算法计算这两个大数的乘积,结果用字符串表示.例如S1="7832974972840919321747983209327",S2="19 ...

  9. Django数据库操作(增删改查)

    Django数据库操作(增删改查) 创建数据库中的一个表 class Business(models.Model): #自动创建ID列 caption = models.CharField(max_l ...

  10. 在Intellij IDEA中使用Debug

    Debug用来追踪代码的运行流程,通常在程序运行过程中出现异常,启用Debug模式可以分析定位异常发生的位置,以及在运行过程中参数的变化.通常我们也可以启用Debug模式来跟踪代码的运行流程去学习三方 ...