在做itoo 3.0 的时候,考评系统想要上线,就開始导入数据了,仅仅导入学生2万条数据,可是导入的速度特别的慢。这个慢的原因是由于导入的时候进行了过多的IO操作。可是导入成功之后,查询学生的速度更加慢。由于底层用了hibernate的hql语句进行查询的,学习过hibernate的人都知道,假设hibernate不设置懒载入的话,仅仅有是有关联的数据都会一次性所有都查询出来,我试了试。查询2万条数据,最深的级联查询是有5层,然后发出来的语句是460条,时间大概是10s。然后就考虑使用lazy进行优化。然后就開始对lazy进行了一个研究。

问:懒载入能够提高性能吗?

不能够简单的说"能",由于Hibernate的关系映射拖累了SQL的性能,所以想出懒载入来弥补.仅仅是弥补而以,不会超越.所以大家不要想着使用了懒载入整体性能就提高了,事实上整体性能不下降就万幸了.

问:Hibernate的lazy属性能够配置在哪里?

(经常使用)<set><list>标签上 ,能够取值true,false,extra默觉得true,当为true时,会懒载入,訪问集合属性时再发出SQL语句.但set.size()时,非常不智能,不会生成count()语句,而是查出全部记录赋值给set.

extra说明:调用集合的set.size()时,会生成selectcount(*)from tableName,比較智能.建议使用

(少用)<many-to-one><one-to-one>标签上 ,能够取值false,proxy,noproxy 当为true时,会有懒载入特性,当为false时会产生N+1问题,比方一个学生相应一个班级,用一条SQL查出10个学生,当訪问学生的班级属性时Hibernate会再产生10条SQL分别查出每一个学生相应的班级.

(不用)<class>标签上 ,能够取值true,false 默觉得true,当为false时,load()方法将失去懒载入的特性与get()一样,不影响集合(<set><list>)标签上的lazy特性

(不用)<property>标签上 ,能够取值true,false  默认值为false,懒载入某个字段,无意义,不要使用

问:get()与load()的差别

get()无懒载入特性,立即运行SQL查询.

load()有懒载入特性,会返加一个代理对象,所以永远不为null,先不运行SQL,要取对象的值时才运行SQL语句,前题session不能关闭,<class>标签上lazy不为false.

问:使用懒载入的条件

1 PO不能是final的

2能实现懒载入的对象(PO)都是被CGLIB改写的代理对象,所以不能是final修饰的

3需要asm,cglib两个jar包

4对应的lazy属性为true

5 对应的fetch属性为select

问:什么时候遇到懒载入

1 使用load()

2 一对一<one-to-one>

查主对象默认使用join连接,不会发生懒载入

查从对象默认会发生懒载入,先运行一句select查出从对象,当通过从对象訪问了主对象时,再运行一句select查出主对象.

3多对一<many-to-one>

在使用hbm.xnl时,取多的一方时,默认会懒载入。不取一的一方

在使用JPA时,取多的一方时,默认自己主动使用joinon语句取出一的一方(用户与组,用户是多的一方,组是一的一方)

4一对多(<set><list>)

默认会懒载入。这是必须的。是重经常使用的。

问:实现懒载入的方案有哪些?

方法一:(没有使用懒载入)

用 Hibernate.initialize(de.getEmps()) 提前载入一下.

方法二:

把与Session脱离的对象又一次绑定

lock()方法是用来让应用程序把一个未改动的对象又一次关联到新session的方法。

//直接又一次关联

ssion.lock(fritz,LockMode.NONE);

//进行版本号检查后关联

session.lock(izi,LockMode.READ);

//使用SELECT ... FORUPDATE进行版本号检查后关联

session.lock(pk,LockMode.UPGRADE);

方法三:

OpenSessionInView

OpenSessionInViewFilter是Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开Hibernate的Session,一直保持这个Session。直到这个请求结束,详细是通过一个Filter来实现的。

因为Hibernate引入了LazyLoad特性。使得脱离Hibernate的Session周期的对象假设再想通过getter方法取到其关联对象的值。Hibernate会抛出一个LazyLoad的Exception。所以为了解决问题,Spring引入了这个Filter,使得Hibernate的Session的生命周期变长。

详细參考:http://www.iteye.com/topic/32001

问:fetch 和lazy 配置怎样用于数据的查询

lazy 參数值常见有 false 和 true,Hibernate3 映射文件里默认lazy = true ;

fetch 指定了关联对象抓取的方式。參数值常见是select和join,默认是select,select方式先查询主对象。再依据关联外键,每个对象发一个select查询。获取关联的对象。形成了n+1次查询。而join方式,是left outerjoin查询,主对象和关联对象用一句外键关联的sql同一时候查询出来,不会形成多次查询。

在映射文件里。不同的组合会使用不同的查询:

1、lazy="true" fetch = "select"。使用延迟策略,開始仅仅查询出主对象。关联对象不会查询。仅仅有当用到的时候才会发出sql语句去查询 。

2、lazy="false" fetch = "select"。没实用延迟策略,同一时候查询出主对象和关联对象,产生1+n条sql.

3、lazy="true"或lazy="false" fetch ="join",延迟都不会作用。由于採用的是外连接查询。同一时候把主对象和关联对象都查询出来了.

另外,在hql查询中,配置文件里设置的join方式是不起作用的,而在其它查询方式如get、criteria等是有效的,使用select方式;除非在hql中指定join fetch某个关联对象。

fetch策略用于get/load一个对象时,怎样获取非lazy的对象/集合。这些參数在Query中无效。

最后由于前端框架使用的是easyui,绑定数据的时候,后台的数据须要转换成为json串,使用懒载入的话。级联查询数据在转换的时候就会出问题。所以UI后就把懒载入的方式舍弃了,下一节未大家介绍还有一种方式优化。

转载于:https://www.cnblogs.com/liguangsunls/p/6821313.html

【java】itoo项目实战之hibernate 懒载入优化性能相关推荐

  1. Java Web项目实战案例一

    Java Web项目实战案例一 一.主要开发工具如下: 1.物理机:windows 10 2.apache-maven-3.5.3 3.jdk1.8.0_161 4.Intellij 二.构建过程 项 ...

  2. JAVA框架项目实战:系统公告设计及实现

    项目实战:系统公告设计及实现 本期涉及内容:JDBC.点击即可跳转复习JDBC 1.需求及业务设计 项目(公告系统) 1.需求(为行政人员发布公告,通知提供遍历) 2.原型设计(系统做完以后是什么样子 ...

  3. 【VUE项目实战】64、CND优化ElementUI以及首页内容定制

    接上篇<63.指定打包入口及加载外部CDN资源> 上一篇我们为开发模式与发布模式制定不同的打包入口,然后为项目加载外部CDN资源.本篇我们来学习通过CND优化ElementUI的打包,以及 ...

  4. JAVA Drp项目实战—— Unable to compile class for JSP 一波三折

    交代下背景.电脑系统是64位的,用的是64位的Tomcat.安装是32位的Myeclipse10,java环境也是32位的.Tomcat在開始启动时会报这样一个错误,"Can't load ...

  5. 报名学习开课吧Java商业项目实战就业班

    一.HTML 1. HTML的注释 <!--注释内容--> 2. HTML常用标签 (1)标题标签<h1></h1> <h2></h2> & ...

  6. java o2o_Java项目实战篇之校园O2O商铺平台-开发准备一

    校园O2O商铺平台 一. 项目介绍 校园o2o平台是一个新兴的电子商务平台,主要是为了广大学生群体建立一个实用性,广泛性,快捷性的消费平台.就大学生的消费的状况,市场份额相当巨大,消费潜力也是非常可观 ...

  7. 最新《JPA入门到精通JAVA进阶项目实战》

    『课程介绍』: 通过对本课程的学习,能够对JPA能够有全面的认识,简化现有Java EE和Java SE应用开发工作.用来操作实体对象,执行CRUD操作,框架在后台替代我们完成所有的事情,开发者从繁琐 ...

  8. java se项目实战视频_项目整体测试_09-JAVASE项目实战-电影管理系统_Java视频-51CTO学院...

    基础篇https://edu.51cto.com/course/19845.html https://edu.51cto.com/course/19845.html https://edu.51cto ...

  9. Java Drp项目实战——Drp知多少

    是什么 Drp是Distribution Resource Planning的缩写,意思是分销资源计划.它是用来管理企业的执行于Internet上的分销网络的系统,是以商业流程优化为基础,它的核心是销 ...

最新文章

  1. C4D灯光照明技术学习教程
  2. 用python画动图_用Python绘制会动的柱形竞赛图
  3. linux tail命令详解
  4. c语言调用hzk16,C语言使用HZK16显示每个像素的代码
  5. lagrange插值(完成)
  6. 懒与馋的平衡:餐饮O2O市场广阔,发展不易
  7. python spark社区_Spark中文python文档
  8. Crazypony四轴飞行器代码框架
  9. 拓端tecdat|R语言用有限混合模型(FMM,finite mixture model)创建衰退指标对股市SPY、ETF收益聚类和双坐标图可视化
  10. appium 学习教程
  11. 恶意代码防范技术原理-恶意代码概述
  12. java excel 设置列为日期,POI设置Excel单元格格式 (数值,日期,文本等等)
  13. 华为 2015 机试 输出:数字后面的连续出现的(2个或多个)相同字符(数字或者字符),删去一个,非数字后面的不要删除,例如,对应输出为:33aabb55pin。...
  14. LED背光源的正反面怎么区分?
  15. 2019最新个税计算_python
  16. NodeJS充分利用多核CPU以及它的稳定性
  17. redis数据库(一)
  18. Intel TBB的学习动态并行
  19. #ifndef #defin #endif的用法
  20. TortoiseSVN-1.6.5.16974(开源文件版本管理软件) 安装图解教程及下载文件

热门文章

  1. Android设置Settings:预读取设置的选项和更新设置结果【2】
  2. 3D图形图像处理软件HOOPS介绍及下载
  3. 如何获取浏览器的DNS解析时间
  4. 在ASP.NET中重写URL 方法三:在IIS7中使用HttpModule 实现无扩展名的URL重写
  5. [导入]关于怎样通过xslt向.NET扩展函数传递OuterXml属性
  6. linux下获取某文件的总行数
  7. python字符串27种常见的方法
  8. Vmware workstation 网络连接类型
  9. 5个强大的Java分布式缓存框架推荐
  10. iOS开发:Objective-C优雅的语法