在做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后就把懒载入的方式舍弃了,下一节未大家介绍还有一种方式优化。

【java】itoo项目实战之hibernate 懒载入优化性能的更多相关文章

  1. 【java】itoo项目实战之hibernate 批量保存优化

    在itoo中.基本上每一个系统都有一个导入功能,大量的数据填写进入excel模板中.然后使用导入功能导入的数据库中,这样能够大大的提高工作效率. 那么导入就涉及到了批量保存数据库的问题了. 那么通常情 ...

  2. 【java】itoo项目实战之大数据查询之使用 new map 优化hibernate之级联查询

    在我的上一篇博客<[java]itoo项目实战之hibernate 懒载入优化性能>中,我曾提到过学生数据有2万条,查询数据十分的慢,这是让人非常受不了的事情.看着页面进度条一直转着圈圈, ...

  3. Java Web项目实战第1篇之环境搭建

    写在前面的话 从今天开始一个Java Web实战项目,参考自 http://blog.csdn.net/eson_15/article/details/51277324 这个博客(非常感谢博主的分享精 ...

  4. Java高级项目实战03:CRM系统数据库设计

    接上一篇:Java高级项目实战02:客户关系管理系统CRM系统模块分析与介绍 欢迎点击回顾,接下来我们说说 CRM系统数据库设计. 我们根据产品的原型搞以及UI组的设计稿, 接下来就要设计数据库, 一 ...

  5. Java高级项目实战02:客户关系管理系统CRM系统模块分析与介绍

    本文承接上一篇:Java高级项目实战之CRM系统01:CRM系统概念和分类.企业项目开发流程 先来CRM系统结构图: 每个模块作用介绍如下: 1.营销管理 营销机会管理:针对企业中客户的质询需求所建立 ...

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

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

  7. Java Drp项目实战——Servlet

    由来 在解说Servlet之前须要先介绍一个词语CGI即Common GatewayInterface是通用网关接口的意思.它提供一个计算机程序同HTTP协议或者WWW服务的接口,也就是人机交互接口的 ...

  8. Java Drp项目实战—— 环境搭建

    概要 我们要開始一个关于Java项目的开发,那么我们就须要搭建一个关于Java开发的环境,那么搭建一个Java开发环境,都须要些什么东东,又有些什么注意事项呢. 过程 我先将我搭建Java环境的软件和 ...

  9. Java Drp项目实战——Web应用server

    引言 Web应用server如今非常多人都在用,但是究竟什么是Web应用server呢,它与Webserver有什么关系,它与应用server又是什么关系,它是他们两种中的当中一种,还是简单的两种se ...

随机推荐

  1. 洛谷p1049 01背包

    dp水之旅背包 题目描述 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30,每个物品有一个体积(正整数). 要求n个物品中,任取若干个装入箱 ...

  2. linux破解root登录密码,并重置

    重启系统后按'e'键,进入编辑模式,在'UTF -8'后空格输入'rd.break'后,按快捷键'Ctrl+X'进入新界面进行编辑,代码如下: switch_root:/# mount -o remo ...

  3. 阿里云配置tomcat后不能访问问题

    问题:使用阿里云centos 7.2配置好tomcat后,启动时间9分多钟,停在webapps下的manage这里近9分多钟 解决:进入 /usr/local/jdk1.8.0_144/jre/lib ...

  4. Android布局之相对布局——RelativeLayout

    此博文主要是相对布局xml属性的解析及实例. android:layout_above:此控件底部的边缘位于设定ID控件的上方 <Button android:id="@+id/btn ...

  5. 【pwnable】asm之write up

    首先查看源代码: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <s ...

  6. Postfix mail for azengna.com loops back to myself -solve

    设置 /etc/postfix/main.cf 原配置 mydestination = $myhostname, localhost.$mydomain, localhost 改为 mydestina ...

  7. POJ 2631 Roads in the North (求树的直径)

    Description Building and maintaining roads among communities in the far North is an expensive busine ...

  8. Oracle中的特殊判式

    Oracle中的特殊判式 除了逻辑运算之外,Oracle提供了一些特殊判式.这些判式可以用来生成更加复杂和灵活的查询条件.本节将着重介绍以下几种判式. Between: 取值范围 In: 集合成员测试 ...

  9. PTA 02-线性结构4 Pop Sequence (25分)

    题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/665 5-3 Pop Sequence   (25分) Given a stack wh ...

  10. HDU 1278

    题目大意: 从(1,1)到(n,n),每经过一个点都要花费一定的时间,问花最短时间的路径有多少条 dfs+dp 先用bfs把所有到n花费的时间逆向dp计算一遍 再用dfs不断找到前一个对应的较短路径的 ...