Hibernate综合问题
n + 1问题
query.iterate()信息返回迭代查询将开始发表声明:录ID语句
Hibernate: select student0_.id ascol_0_0_from t_student student0_
然后有多少条记录,会发出多少条查询语句。
n + 1问题:n:有n条记录。发出n条查询语句。1 :发出一条查询全部记录ID语句。
出现n+1的原因:由于iterate(迭代查询)是使用缓存的,第一次查询数据时发出查询语句载入数据并增加到缓存,以后再查询时hibernate会先到ession缓存(一级缓存)中查看数据是否存在。假设存在则直接取出使用,否则发出查询语句进行查询。
session=HibernateUtils.getSession();
tx = session.beginTransaction(); /**
* 出现N+1问题
* 发出查询id列表的sql语句
* Hibernate: select student0_.idas col_0_0_ from t_student student0_
*
* 再依次发出依据id查询Student对象的sql语句
* Hibernate: select student0_.idas id1_0_, student0_.name as name1_0_,
* student0_.createTime ascreateTime1_0_, student0_.classesid as classesid1_0_
* from t_student student0_ wherestudent0_.id=? */
Iterator students =session.createQuery("fromStudent").iterate(); while (students.hasNext()){
Student student=(Student)students.next();
System.out.println(student.getName());
}
tx.commit();先运行query.list()。再运行query.iterate。这样不会出现N+1问题
由于list操作已经将Student对象放到了一级缓存中,所以再次使用iterate操作的时候
它首先发出一条查询id列表的sql。再依据id到缓存中取数据。仅仅有在缓存中找不到对应的
数据时,才会发出sql到数据库中查询
List students =session.createQuery("from Student").list(); for (Iterator iter =students.iterator();iter.hasNext();){
Student student=(Student)iter.next();
System.out.println(student.getName());
} System.out.println("---------------------------------------------------------");
// 不会出现N+1问题,由于list操作已经将数据增加到一级缓存。
Iterator iters=session.createQuery("from Student").iterate(); while (iters.hasNext()){
Student student=(Student)iters.next();
System.out.println(student.getName());
}list 和 iterate不同之处
a) list取全部
b) Iterate先取ID,等用到的时候再依据ID来取对象
c) session中list第二次发出。仍会到数据库查询
d) iterate第二次,首先找session级缓存
Session级缓存(一级缓存)
一级缓存非常短和session的生命周期一致。因此也叫session级缓存或事务级缓存
哪些方法支持一级缓存:
get()
load()
iterate(查询实体对象)
怎样管理一级缓存:
session.clear(),session.evict()
怎样避免一次性大量的实体数据入库导致内存溢出
先flush,再clear
假设数据量特别大。考虑採用jdbc实现,假设jdbc我们不能满足数据的要求本身就可以被认为是一个特定的导入工具
版权声明:本文博主原创文章,博客,未经同意不得转载。
Hibernate综合问题的更多相关文章
- 基于注解Spring MVC综合Hibernate(需要jar包,spring和Hibernate整合配置,springMVC组态,重定向,)批量删除
1.进口jar 2.web.xml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app ver ...
- Hibernate之综合问题
n + 1问题 query.iterate()方式返回迭代查询会开始发出一条语句:查询所有记录ID语句 Hibernate: select student0_.id ascol_0_0_from t_ ...
- Mybatis(综合案例)
MyBatis本是apache的一个开源项目iBatis,2010年这个项目有Apache software foundation 迁移到了Google code,并改名MyBatis.2013年11 ...
- 16~25.spring+hibernate简单实例 .连接数据库并进行增删改查
1.概念 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQ ...
- 大分享-hibernate,springmvc,easyui简要介绍
近期公司一直在做项目,主要用到了springMVC,eseayui,hibernate几大框架.近一个月的时间,个人就目前自我知识给予分享. 很多公司使用mybatis产品,综合所述其最大优点是全SQ ...
- Java Web整合开发实战:基于Struts 2+Hibernate+Spring 目录
第1篇 Java Web开发基础第1章 Web的工作机制( 教学视频:31分钟) 1.1 理解Web的概念 1.1.1 Web的定义 1.1.2 Web的三个核心标准 1.2 C/S与B/S两种软件体 ...
- Hibernate解决n+1问题
观点:对于n+1问题的理解. 一般而言说n+1意思是,无论在一对多还是多对一当查询出n条数据之后,每条数据会关联的查询1次他的关联对象,这就叫做n+1. 但是我的理解是,本来所有信息可以一次性查询出来 ...
- 菜鸟学习Hibernate——持久层框架
一.Java操作数据库的阶段. Java对数据库进行操作经历了三个阶段. 1.1操作JDBC阶段 这个阶段就是利用JDBC类来操作数据库.这个阶段出现了两个问题: 代码过度重复:在每一次数据库操作的是 ...
- 03.Hibernate一对多关联
前言:在域模型中,类与类之间最普遍的关系就是关联关系,在UML语言中关联关系是有方向的.在数据库中表与表之间也会有关联关系,本节介绍通过Hibernate映射一对多的关联关系,这是一种最普遍的关联关系 ...
随机推荐
- [Android 4.4.2] 泛泰A870 Mokee4.4.2 20140531 RC1.0 by syhost
欢迎关注泛泰非盈利专业第三方开发团队 VegaDevTeam (本team 由 syhost suky zhaochengw(z大) xuefy(大星星) tenfar(R大师) loogeo cr ...
- JavaFX2 - 文本可复制的Label
背景介绍 我的公司和我个人一直都使用JavaFX2来编写client应用程序,同一时候也作为Applet在浏览器中执行. 我们的客户以前拿我们的产品和网页对照,然后向我们提过两个需求: (1) 希望界 ...
- php实现兼容Unicode文字的字符串大写和小写转换strtolower()和strtoupper()
前言 网上流传着这么一个腾讯笔试题: PHP的strtolower()和strtoupper()函数在安装非中文系统的server下可能会导致将汉字转换为乱码,请写两个替代的函数实现兼容Unicode ...
- javascript进阶教程第三章--匿名和闭包--案例实战
javascript进阶教程第三章--匿名和闭包--案例实战 一.学习任务 通过几个小练习回顾学过的知识点 二.实例 练习1: 实例描述:打开页面后规定时间内弹出一个新窗口,新窗口指定时间后自动关闭. ...
- 关于DMA
用串口在dma中发东西的时候,,, 要判断DMA里是不是由东西,是不是在占用 当多个外设再用DMA的时候,,,要查看DMA有没有占用 一包数没发完,不要再传另一包
- goland 2018.2 激活
感谢 http://blog.sina.com.cn/s/blog_1885d23df0102ydjc.html http://www.3322.cc/soft/38102.html 下载 htt ...
- PatentTips - Modified buddy system memory allocation
BACKGROUND Memory allocation systems assign blocks of memory on request. A memory allocation system ...
- AE中地图查询方式
樱木 原文 AE中地图查询方式 地图查询主要有两种查询:空间查询和属性查询 所用到知识点: 1 Cursor(游标)对象 本质上是一个指向数据的指针,本身不包含数据内容,提供一个连接到ROW对象或者 ...
- JNI——Java调用C/C++函数
从C/C++到Java,再从Java回到C/C++,今天终于有机会了解了连接Java.C/C++的桥梁——JNI.哈哈!分享一下! 一.简介 JNI是Java native interface的简 ...
- jquery画图插件jPainter
jquery画图插件jPainter 一.总结 一句话总结:四年前的项目,四年无更新,不好用. 二.基于HTML5 Canvas和jQuery 的画图工具的实现 简介 HTML5 提供了强大的Canv ...