【java】itoo项目实战之hibernate 懒载入优化性能
在做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 懒载入优化性能的更多相关文章
- 【java】itoo项目实战之hibernate 批量保存优化
在itoo中.基本上每一个系统都有一个导入功能,大量的数据填写进入excel模板中.然后使用导入功能导入的数据库中,这样能够大大的提高工作效率. 那么导入就涉及到了批量保存数据库的问题了. 那么通常情 ...
- 【java】itoo项目实战之大数据查询之使用 new map 优化hibernate之级联查询
在我的上一篇博客<[java]itoo项目实战之hibernate 懒载入优化性能>中,我曾提到过学生数据有2万条,查询数据十分的慢,这是让人非常受不了的事情.看着页面进度条一直转着圈圈, ...
- Java Web项目实战第1篇之环境搭建
写在前面的话 从今天开始一个Java Web实战项目,参考自 http://blog.csdn.net/eson_15/article/details/51277324 这个博客(非常感谢博主的分享精 ...
- Java高级项目实战03:CRM系统数据库设计
接上一篇:Java高级项目实战02:客户关系管理系统CRM系统模块分析与介绍 欢迎点击回顾,接下来我们说说 CRM系统数据库设计. 我们根据产品的原型搞以及UI组的设计稿, 接下来就要设计数据库, 一 ...
- Java高级项目实战02:客户关系管理系统CRM系统模块分析与介绍
本文承接上一篇:Java高级项目实战之CRM系统01:CRM系统概念和分类.企业项目开发流程 先来CRM系统结构图: 每个模块作用介绍如下: 1.营销管理 营销机会管理:针对企业中客户的质询需求所建立 ...
- JAVA Drp项目实战—— Unable to compile class for JSP 一波三折
交代下背景.电脑系统是64位的,用的是64位的Tomcat.安装是32位的Myeclipse10,java环境也是32位的.Tomcat在開始启动时会报这样一个错误,"Can't load ...
- Java Drp项目实战——Servlet
由来 在解说Servlet之前须要先介绍一个词语CGI即Common GatewayInterface是通用网关接口的意思.它提供一个计算机程序同HTTP协议或者WWW服务的接口,也就是人机交互接口的 ...
- Java Drp项目实战—— 环境搭建
概要 我们要開始一个关于Java项目的开发,那么我们就须要搭建一个关于Java开发的环境,那么搭建一个Java开发环境,都须要些什么东东,又有些什么注意事项呢. 过程 我先将我搭建Java环境的软件和 ...
- Java Drp项目实战——Web应用server
引言 Web应用server如今非常多人都在用,但是究竟什么是Web应用server呢,它与Webserver有什么关系,它与应用server又是什么关系,它是他们两种中的当中一种,还是简单的两种se ...
随机推荐
- 从零实现一个http服务器
我始终觉得,天生的出身很重要,但后天的努力更加重要,所以如今的很多“科班”往往不如后天努力的“非科班”.所以,我们需要重新给“专业”和“专家”下一个定义:所谓专业,就是别人搞你不搞,这就是你的“专业” ...
- docker 私有镜像服务器搭建
1.准备一台服务器A(已安装docker, IP:192.168.39.111) 2.在服务器A上通过运行registry容器进行搭建 docker run -itd -v /my_registry: ...
- 部署安装lnmp
链接:http://pan.baidu.com/s/1skMSgDv 密码:h8rn 此安装包可在阿里云所有linux系统上部署安装.此安装包包含的软件及版本为:nginx:1.0.15.1.2.5. ...
- swoole 编程环境安装
安装linux debian 9.8 购买阿里云vps web目录规划 lnmp/source lnmp/soft lnmp/data 源码安装php apt install gcc make apt ...
- 剑指Offer(书):删除链表的节点
题目:在O(1)的时间内删除列表节点. /** * 步骤: * 1.检查head与removeNode节点是否为空 * 2.检查removeNode的后一个节点是否为空,不为空则使用后一个节点的值覆盖 ...
- Java学习关于集合框架的基础接口--Collection接口
集合框架(Collection Framework)是Java最强大的子系统之一,位于java.util 包中.集合框架是一个复杂的接口与和类层次,提供了管理对象组的最新技术.Java集合框架标准 ...
- python3--产生偏移和元素:enumerate
之前,我们讨论过通过range来产生字符串中元素的偏移值.而不是那些偏移值处的元素.不过,在有些程序中.我们两者都需要,要用的元素以及值个元素的偏移值.从传统意义来讲,这是简单的for循环,他同时也持 ...
- BigTable
Bigtable发布于2006年,启发了无数的NoSQL数据库,比如:Cassandra.HBase等等. Cassandra架构中有一半是模仿Bigtable,包括了数据模型.SSTables以及提 ...
- [HDU4417]Super Mario(主席树+离散化)
传送门 又是一道主席树模板题,注意数组从0开始,还有主席树耗费空间很大,数组开大点,之前开小了莫名其妙TLE.QAQ ——代码 #include <cstdio> #include < ...
- 道路游戏(洛谷 P1070)
题目描述 小新正在玩一个简单的电脑游戏. 游戏中有一条环形马路,马路上有 n 个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针顺序依次将这 n 个机器人工厂编 ...