分享知识-快乐自己:Hibernate中的 quert.list() 与 quert.iterate() 方法区别
区别如下:
quert.list() :
1):每次都是通过一条语句直接操作数据库取出所有的数据返回(并且将对象存入hibernate缓存中);
2):不会从一二级缓存中查询数据;
3):之执行一条SQL语句,查询所有。
quert.iterate():
1):iterator首先通过一条语句取出所有数据的id,然后通过id在hibernate的一级缓存中查找是否存在该对象,
2):如果存在则直接取出,如果没有则再次发出一条sql语句通过id取得对象(并且加入到缓存中),
3):这样如果所有的id在缓存中都没有的话就会出现n+1条sql语句的问题。
这样大家可能会想,同样的查询条件,第一次先list,第二次再iterate,就可以使用到缓存了。
实际上这是很难的,因为你无法判断什么时候是第一次,而且每次查询的条件通常是不一样的,假如数据库里面有100条记录,id从1到100,
第一次list的时候出了前50个id,第二次iterate的时候却查询到30至70号id,那么30-50是从缓存里面取的,51到70是从数据库取的,共发送1+20条sql
相关测试关键代码:
/****
* list查询数据:观察产生的SQL语句条数(共 N+1+1 条SQL)
*/
@Test
public void listUser()
{
//iterate:执行(N+1)条SQL语句:一条查询所有的ID,然后根据OID查询详细信息。
// 首先会经过缓存,缓存中没有匹配信息的话,则走数据库执行SQL语句查询(并添加到缓存中)
Iterator<User> from_user1 = session.createQuery("from User").iterate();
while (from_user1.hasNext())
{
System.out.println(from_user1.next());
}
System.err.println("*************\n");
//list:执行一条SQL语句:只往缓存中存放,无法读取一二级缓存
List<User> from_user = session.createQuery("from User").list();
for (User temp:from_user)
{
System.out.println(temp);
}
}
/****
* iterate查询数据:观察产生的SQL语句条数(共2条SQL)
*/
@Test
public void iterateUser()
{
//list:执行一条SQL语句:只往缓存中存放,无法读取一二级缓存
List<User> from_user = session.createQuery("from User").list();
for (User temp:from_user)
{
System.out.println(temp);
}
System.err.println("*************");
//iterate:执行(N+1)条SQL语句:一条查询所有的ID,然后根据OID查询详细信息。
// 首先会经过缓存,缓存中没有匹配信息的话,则走数据库执行SQL语句查询(并添加到缓存中)
Iterator<User> from_user1 = session.createQuery("from User").iterate();
while (from_user1.hasNext())
{
System.out.println(from_user1.next());
}
}
分享知识-快乐自己:Hibernate中的 quert.list() 与 quert.iterate() 方法区别的更多相关文章
- Jquery中的has、find、filter方法区别
find方法 find返回的是匹配结果集,作用于后代$(‘li’).find(‘.a’).css(‘background-color’, ‘red’);在li下面查找元素是否有class=a的元素,返 ...
- Hibernate中load与get,update与merge方法的区别
1.load()与get()的区别: (1)load()读取 User user = (User)session.load(User.class, userId); (2)get()读取 User u ...
- 分享知识-快乐自己:MYSQL之內链接 左链接 右链接 区别
MYSQL中可以通过内外键链接,将有关系的表中数据合并到一起进行条件筛选: 首先创建两个新表,数据如下: student 表数据: score 表数据: 可以看到students表中stu_id为16 ...
- hibernate 中的 lazy=”proxy” 和 lazy=”no-proxy” 的区别
网上找到个描述的很精妙的例子 Child <- many-to-one ->Parent class Child { private ...
- JavaScript中正则表达式test()、exec()、match() 方法区别
1.test test 返回 Boolean,查找对应的字符串中是否存在模式.var str = "1a1b1c";var reg = new RegExp("1.&qu ...
- 分享知识-快乐自己:Hibernate各种查询操作
Hibernate各种查询操作(一) 测试数据库如下: t_sort表: t_good表: 一.对象导航方式查询 查询所有食品类下面 ...
- Hibernate中事务的隔离级别设置
Hibernate中事务的隔离级别,如下方法分别为1/2/4/8. 在Hibernate配置文件中设置,设置代码如下
- hibernate中session的获取使用以及其他注意事项
hibernate中session的获取使用以及其他注意事项 前言:工作时,在同时使用Hibernate的getSession().getHibernateTemplate()获取Session后进行 ...
- (七)Hibernate中使用JDBC
在hibernate中获取connection数据库连接有两种方法:(操作数据库常用这种方法) 1. session.doReturningWork 返回一个对象,适用于查询方法 2. sessi ...
随机推荐
- HDoj-1233-还是畅通project-prim算法
还是畅通project Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- 谈 API 的撰写 - 架构
在 谈 API 的撰写 - 总览 里我们谈到了做一个 API 系统的基本思路和一些组件的选型,今天谈谈架构. 部署 首先要考虑的架构是部署的架构.部署的方案往往会深刻影响着系统的结构.我们需要问自己一 ...
- tomcat启动出现异常 Error filterStart
tomcat启动中出现 Error filterStart异常, 没有任何堆栈信息,如下: SEVERE: Error filterStart Jul 6, 2012 3:39:05 PM org.a ...
- 《C陷阱与缺陷》学习笔记(一)
前言和导读 "得心应手的工具在初学时的困难程度往往超过那些easy上手的工具."比較认同这句话. 我至今认为自己事实上还是个刚入了门的刚開始学习的人. 第一章 "词法&q ...
- template.js文档
参见GitHub:https://github.com/yanhaijing/template.js/ template.js简介: template.js 一款javascript模板引擎,简单,好 ...
- C# Winform 运行异常 CefSharp.core.dll 找不到指定的模块
C# Winform开发中使用了CefSharp,之前在VS2012中运行很正常,今天换了一台Windows XP 打开VS2010 运行时,发生异常:System.IO.FileNotFoundEx ...
- Python 规范化LinkedIn用户联系人的职位名
CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-8-19 @author: guaguastd @name: j ...
- Java编码辅助工具:Lombok —— 避免重复臃肿的代码,提高效率
在项目开发过程中,经常会涉及到一些调整很少但又必不可少的环节,比如实体类的Getter/Setter方法,ToString方法等.这时可以使用Lombok来避免这种重复的操作,减少非核心代码的臃肿,提 ...
- C# 杀掉后台进程
var p = Process.GetProcessesByName("WINWORD"); if (p.Any()) { for (int i = 0; i < p.Len ...
- 【Python基础】之for循环、数组字典
一. for循环实例 1.循环字符串 Python Shell: for i in "hello": print(i) h e l l o 2.循环数组Python Shell: ...