hibernate之性能优化

hibernate是建立在JDBC基础上的框架,但他有很多JDBC所无法比拟的性能优化技术。下面介绍几种优化策略。

1.使用dynamic-insert与dynamic-update

在class标签中使用该属性,可以设置hibernate动态的生成SQL语句,而不是在hibernate启动时就生成预设的SQL语句。

当其设置为true时,hibernate会根据实际需求设置新增或更新的字段,而不是所有的字段。

<class name="com.hibernate.book" table="BOOK" dynamic-insert="true" dynamic-update="true">

2.延迟加载

为了避免在关联查询中带来无谓的开销而使用,即尽在需要读取数据库时才查询数据库。session的load()方法采用了,get()则没有。

(1)持久化对象的延迟加载

配置:

<class name="com.hibernate.Category" table="CATEGORY" lazy="true">

下述操作不会输出任何sql语句:

Category category= (Category) session.load(Category.class, new Integer(1));

tx.commit();

注:

load()方法获取的不是真正的持久化对象,而是一个代理对象(包含目标对象的属性和方法)。

代理对象仅需要得到持久化类对象的引用,不需要获取所有属性值。

为顺利生成代理对象,hibernate的持久化类必须有公开的构造方法,不能声明为final。

(2)集合对象的延迟加载

地位:是延迟加载最重要的部分可以大幅度提高性能。

配置:

<class name="com.hibernate.Category" table="CATEGORY" lazy="true">

<set name="products" cascade="save-update" inverse="true" lazy="false">

.....

</set>

</class>

下面操作不会查询product表的值:

Category category= (Category) session.load(Category.class, new Integer(1));

System.out.println(category.getName());

tx.commit();

注:

product集合设置lazy=‘extra‘后,调用product的size(), contains(), 和isEmpty()方法不会引发不必要的查询。

(3)属性的延迟加载

一些数据库表有大数据字段类型(blob,clob),但其使用麻烦,且大多数情况下对提高性能有限。

(4)延迟加载出现的违例问题

使用hibernate.initialize():在session关闭之前强制加载被关联的对象。

使用open session in view设计模式。

3. 集合对象的抓取策略

概念:指hibernate在读取关联对象时所采取的策略。

(1)查询抓取(select fetching):先通过一个sql语句查询持久化对象,再通过另一个查询语句查询关联的对象。设置该策略后仍可使用HQL或者Criteria对象重载抓取策略。

(2)子查询抓取(Subselect fetching):先通过一个sql语句查询持久化对象,再通过另一个子查询语句查询关联的对象。

(3)链接抓取(join fetching):使用外连接语句获取当前对象或者相关的对象。不会对使用HQL语句的查询生效,只对其他查询方式如:session.get(),criteria.list()有效。

(4)批量查询(Batch fetching):先通过查询获取一个主键或外键列表,再使用单条语句获取对象。hibernate在查询时会按照设置的数值分批查询数据。

4. hibernate的“1+N”问题

场景1:

Query对象的iterate()方法获取查询数据。当代码第一次使用iterate()方法时,hibernate会先获取id列表值,再通过N条语句获取数据并添加到缓存中。

若Query对象的iterate()方法总不能很好地命中缓存数据时,将大大影响其性能,此时可以采用list()方法;反之,若可以很好地命中缓存,则可很好地提高性能。

场景2:

一对多,在一方查找得到了n个对象, 那么又需要将n个对象关联的集合取出,于是本来的一条sql查询变成了n+1条 。

多对一,在多方查询得到了m个对象,那么也会将m个对象对应的1方的对象取出, 也变成了m+1。  
解决: 
(1)使用延迟加载,只有当需要关联对象(访问其属性,非id字段)时才会发生查询动作。
(2)采用二级缓存, 即使第一次查询很慢,之后命中缓存也是很快的。

注:本文参考《Hibernate开发与实战》 刘伟 张利国 电子工业出版社 一书

hibernate之性能优化,布布扣,bubuko.com

时间: 2024-10-15 10:21:53

hibernate之性能优化的相关文章

Hibernate的性能优化问题

本文是根据Hibernate帮助文档,以及一些书籍及项目经验整理而成,只提供要点和思路,具体做法可以留言探讨,或是找一些更详细更有针对性的资料. 初用Hibernate的人也许都遇到过性能问题,实现同一功能,用Hibernate与用Jdbc性能相差十几倍很正常,如果不及早调整,很可能影响整个项目的进度. 大体上,对于Hibernate性能调优的主要考虑点如下: ? 数据库设计调整 ? HQL优化 ? API的正确使用(如根据不同的业务类型选用不同的集合及查询API) ? 主配置参数(日志,查询缓

转 高性能、高弹性JSP和Servlet性能优化

高性能.高弹性JSP和Servlet性能优化 2009-01-05 10:00 执木 网络转载 字号:T | T 本文讲述了开发高性能.高弹性的JSP页面和Servlet的性能优化技术.其意思是建立尽可能快的并能适应数量增长的用户及其请求.在本文中,你将学习已经实践和得到证实的性能调整技术,它将大大地提高你的Servlet和Jsp页面的性能,进而提升J2EE的性能. AD:WOT2015 互联网运维与开发者大会 热销抢票 你的J2EE应用是不是运行的很慢?它们能不能承受住不断上升的访问量?本文讲

Hibernate性能优化

性能优化 1.Session.clear()的应用 不断分页循环的时候,使用clear()方法. Java中的内存泄漏: 如果使用java打开某一个资源后,一定要关闭,否则就有可能导致内存泄漏.比如:使用java打开一个文件,实际上是java调用了C,C调用了windows底层的API,如果不手动将资源关闭,C语言必须手动回收内存,这就导致了有java引起的内存泄漏. 2.1+N问题 (1)使用@ManyToOne的时候,默认FetchType=EAGER,此时会自动取出One这一方的信息. (

8.Hibernate性能优化

性能优化 1.注意session.clear() 的运用,尤其在不断分页的时候 a) 在一个大集合中进行遍历,遍历msg,取出其中额含有敏感字样的对象 b) 另外一种形式的内存泄漏( //面试题:Java有内存泄漏吗?语法级别没有,但是可由java引起,例如:连接池不关闭,或io读取后不关闭) 2.1+N 问题(典型的面试题) 举例:当存在多对一关系时,多的一方默认是可以取出一的一方的 @ManyToOne 中 默认为fetch=FetchType.Eager 当load多的一方时,也会加载一的

Hibernate性能优化之EHCache缓存

像Hibernate这种ORM框架,相较于JDBC操作,需要有更复杂的机制来实现映射.对象状态管理等,因此在性能和效率上有一定的损耗. 在保证避免映射产生低效的SQL操作外,缓存是提升Hibernate的关键之一. 加入缓存可以避免数据库调用带来的连接创建与销毁.数据打包拆包.SQL执行.网络传输,良好的缓存机制和合理的缓存模式能带来性能的极大提升,EHCache就提供了这种良好的缓存机制. 在考虑给系统加入缓存进行优化前,复用SessionFactory是Hibernate优化最优先.最基础的

Hibernate 配置文件属性之 级联操作cascade 性能优化inverse

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping pack

柯南君:教你如何对待大型网站平台的性能优化? 之 二--- 应用程序调优 (长篇总结)

柯南君:教你如何对待大型网站平台的性能优化? 之 "二"--- 应用程序调优(长篇总结) 柯南君 上一章 <柯南君:教你如何对待大型电商平台的性能优化?之 一 (方法.指标.工具.定位)>讲到了一些测试方法.测试指标.以及测试工具.稍微讲了一些如何定位的方法?这一章主要讲一下"如何优化应用程序,将其性能提升". 一.基本知识  1.下面讲一些JAVA 程序性能方面的一些看法,首先给大家讲一下应用程序调优,需要调优哪些项? ① 运算的性能 : 看哪一个算法

性能优化(1+N,list与iterator,缓存,事务)

1.注意session.clear()的运用,尤其是不断分页循环的时候 A 在一个大集合中进行遍历,取出其中含有敏感字的对象 B 另一种形式的内存泄露. 2.1+N问题 问题描述:如@ManyToOne时,两个类分别是User与Group,取User时,本想发一条SQL语句,结果顺带发了N条语句,将每个User对应的Group也查询了. 解决方法有三种: (1)设为@ManyToOne(fetch=FetchType.LAZY) (2)在Group类中的@Entity下面加一条@BatchSiz

网站性能优化 - 数据库及服务器架构篇

我先前曾写过三篇有关网站系统.ASP.NET 性能优化的文章,分别从 SQL 语句.数据库设计.ASP.NET 功能.IIS 7 的套件,来探讨此一性能议题.本帖算是系列作的第四篇,整理了一些我看过的书籍和文章,改从「负载均衡.服务器架构.数据库扩展」的角度,提出一些性能优化的建议,以供有建设中大型网站需求的网友们作为参考. 小弟我先前写过的三篇帖子: (一) 30 分钟快快乐乐学 SQL Performance Tuninghttp://www.cnblogs.com/WizardWu/arc