打开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. 神经网络与深度学习笔记 Chapter 6之卷积神经网络

    深度学习 Introducing convolutional networks:卷积神经网络介绍 卷积神经网络中有三个基本的概念:局部感受野(local receptive fields), 共享权重 ...

  2. 怎样查看Jdk是32位还是64位

    怎样查看Jdk是32位还是64位.. ------------- --------------- ------------- 其实还可以这样看哦.. --------------- --------- ...

  3. cocos2dx 在Xcode里面 resource 里面文件夹的搜索

    以前一直在pc上写cocos2dx  第一次到Xcode里面写 发现在resource文件夹里面 添加了新的目录后竟然没有用 这里记录下 在项目里面和classes目录同级的 标签下有个Resourc ...

  4. js实现非模态窗口增加数据后刷新父窗口数据

    父窗口是由两个部分组成,一个html的table,一部分是extjs的gird. 点击grid面板[增加]按钮将会弹出非模态窗口进行新数据的编辑页面 下面是按钮的触发函数代码: var a = win ...

  5. SQL菜鸟学习札记(二)

    五月份一直在写SQL,之后写了一个期末大作业的项目,现在才有时间把之前遇到的各种奇怪的问题整理出来.下一部分札记应该是大作业中使用到的SQL的整理. 一.UPDATE SET语句后面可以并列赋值. 之 ...

  6. Mysql介绍和实践总结

    本文首先介绍mysql的安装和基本使用.进阶操作.讲解mysql的导入导出和自动备份,然后介绍安全模式修改密码和mysql的全文本搜索功能,最后记录了个人使用mysql中遇到的问题集. 开始安装: s ...

  7. 再起航,我的学习笔记之JavaScript设计模式20(策略模式)

    策略模式 策略模式(Strategy):将定义的一组算法封装起来,使其相互之间可以替换.封装的算法具有一定的独立性,不会随客户端变化而变化. 其实策略模式在我们生活中可应用的地方还是比较多的,比如在商 ...

  8. Maven(二)Maven项目的创建(命令、myeclipse)及生命周期

    上一篇给大家介绍了Maven的概念和仓库的一些信息,接下来给大家分享一下使用命令和MyEclipse创建Maven项目 一.使用命令管理Maven项目 1.1.创建Maven java项目 1)创建一 ...

  9. Centos7.2下基于Nginx+Keepalived搭建高可用负载均衡(一.基于Keepalived搭建HA体系)

    说明 本文只为方便日后查阅,不对一些概念再做赘述,网上都有很多明确的解释,也请大家先了解相关概念. 两台搭建HA的服务器是华为云上的ECS(不要忘记开通VPC,保证我们的服务器都处在一个内网环境),由 ...

  10. 2017 ACM/ICPC Asia Regional Shenyang Online spfa+最长路

    transaction transaction transaction Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/1 ...