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之综合问题的更多相关文章

  1. 基于注解Spring MVC综合Hibernate(需要jar包,spring和Hibernate整合配置,springMVC组态,重定向,)批量删除

    1.进口jar 2.web.xml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app ver ...

  2. Hibernate综合问题

    n + 1问题 query.iterate()信息返回迭代查询将开始发表声明:录ID语句 Hibernate: select student0_.id ascol_0_0_from t_student ...

  3. Mybatis(综合案例)

    MyBatis本是apache的一个开源项目iBatis,2010年这个项目有Apache software foundation 迁移到了Google code,并改名MyBatis.2013年11 ...

  4. 16~25.spring+hibernate简单实例 .连接数据库并进行增删改查

    1.概念 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQ ...

  5. 大分享-hibernate,springmvc,easyui简要介绍

    近期公司一直在做项目,主要用到了springMVC,eseayui,hibernate几大框架.近一个月的时间,个人就目前自我知识给予分享. 很多公司使用mybatis产品,综合所述其最大优点是全SQ ...

  6. 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两种软件体 ...

  7. Hibernate解决n+1问题

    观点:对于n+1问题的理解. 一般而言说n+1意思是,无论在一对多还是多对一当查询出n条数据之后,每条数据会关联的查询1次他的关联对象,这就叫做n+1. 但是我的理解是,本来所有信息可以一次性查询出来 ...

  8. 菜鸟学习Hibernate——持久层框架

    一.Java操作数据库的阶段. Java对数据库进行操作经历了三个阶段. 1.1操作JDBC阶段 这个阶段就是利用JDBC类来操作数据库.这个阶段出现了两个问题: 代码过度重复:在每一次数据库操作的是 ...

  9. 03.Hibernate一对多关联

    前言:在域模型中,类与类之间最普遍的关系就是关联关系,在UML语言中关联关系是有方向的.在数据库中表与表之间也会有关联关系,本节介绍通过Hibernate映射一对多的关联关系,这是一种最普遍的关联关系 ...

随机推荐

  1. [LeetCode] Reshape the Matrix 重塑矩阵

    In MATLAB, there is a very useful function called 'reshape', which can reshape a matrix into a new o ...

  2. [SHOI2008]小约翰的游戏John

    Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取 的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不 ...

  3. [SCOI2008]配对

    题目描述 你有 n 个整数Ai和n 个整数Bi.你需要把它们配对,即每个Ai恰好对应一个Bp[i].要求所有配对的整数差的绝对值之和尽量小,但不允许两个相同的数配对.例如A={5,6,8},B={5, ...

  4. hdu 4533 线段树(问题转化+)

    威威猫系列故事——晒被子 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tot ...

  5. HDU1348 Wall 凸包

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1348 题意:给出一个凸包,求出与凸包距离 L的外圈周长 凸包模板题,练练Andrew算法求出凸包周长再 ...

  6. 【Tensorflow系列】使用Inception_resnet_v2训练自己的数据集并用Tensorboard监控

    [写在前面] 用Tensorflow(TF)已实现好的卷积神经网络(CNN)模型来训练自己的数据集,验证目前较成熟模型在不同数据集上的准确度,如Inception_V3, VGG16,Inceptio ...

  7. P2P技术详解(二):P2P中的NAT穿越(打洞)方案详解

    1.内容概述 P2P即点对点通信,或称为对等联网,与传统的服务器客户端模式(如下图"P2P结构模型"所示)有着明显的区别,在即时通讯方案中应用广泛(比如IM应用中的实时音视频通信. ...

  8. git pull 报错 You have not concluded your merge (MERGE_HEAD exists).

    git pull时报错 解决方案:

  9. Spring的注解@Qualifier小结

    有以下接口: public interface EmployeeService { public EmployeeDto getEmployeeById(Long id); } 有两个实现类: @Se ...

  10. MySQL中UTF8编码的数据在cmd下乱码

    MySQL中UTF8编码的数据在cmd下乱,在数据库ide中看到的却是中文. 其实,原因是cmd用gbk的格式来显示数据,那么我们只需要将utf-8存储的数据用gbk的格式输出到cmd即可. 解决方法 ...