- 浏览: 149813 次
- 性别:
- 来自: 天津
-
文章分类
最新评论
-
liuxiang00435057:
不知道,你有这个的实现不,能发给我参考下吗,liuxiang0 ...
RBAC模型的通用权限管理系统的设计(数据模型)的扩展 -
步青龙:
这个批量上传确定可以用吗?我这怎么不行呢,官方的Demo也不行 ...
KindEditor 4.1 发布,开源HTML编辑器
性能优化策略
1. 简介
版本:Hibernate3.2
1.1 目的
1.2 范围
1.3 定义、首字母缩写词和缩略语
1.4 参考资料
1.5 概述
2. 缓存策略
2.1 什么是缓存?
即Hibernate 将数据临时存放在内存中,以便加快数据的存取速度。为此,我们可以想象,缓存的实现,就类似于一个Map 对象,首先需要一个key ,以便定位相应被缓存的数据,而它的value 值,便是被缓存的数据。
2.2 一级缓存
即session 级别的缓存,随着session 的关闭而消失,load/iterator 操作,会从一级缓存中查找数据,如果找不到,再到数据库里面查找。Query.list 操作,如果没有配置查询缓存,将直接从数据库中获取数据。
2.3 二级缓存
即SessionFactory 级别的缓存。默认的情况下是打开的。这是一个全局缓存策略。它可以对对象的数据进行全局缓存 。
2.4 查询缓存
即对查询的结果集进行缓存处理,以便下次相同条件相同HQL 的情况下可以直接从缓存中获取数据。
3. 二级缓存
3.1.1 如何打开二级缓存?
需要更改hibernate 配置文件:
1、 打开二级缓存( 默认情况下是打开的)
a) true
2、 指定缓存策略提供商
a) org.hibernate.cache.EhCacheProvider
3.1.2 二级缓存是对对象数据的缓存
为了让hibernate 对对象进行缓存,你必须指定需要缓存哪些类的对象,这有两种方法可以达到这个目的:
1、 在hibernate 配置文件中指定,如
2、 在类的映射文件中(即标签下指定),如
” read-only ” />
如果你打开了对对象的缓存,那么,所有对这个对象的查询操作的结果,都会被缓存起来。Hibernate 将使用对象的键值作为缓存的key 值,对象的数据作为缓存的value 值。
打开了对象缓存,只有在对对象进行查询操作的时候,才会起作用,如createQuery( “ from Student ” ).iterate()
3.1.3 缓存策略
缓存有几种形式,可以在映射文件中配置:read-only( 只读,适用于很少变更的静态数据/ 历史数据) ,nonstrict-read-write ,read-write( 比较普遍的形式,效率一般) ,transactional(JTA 中,且支持的缓存产品较少)
4. 查询缓存
查询缓存的作用,是对list 操作的查询结果集进行缓存!
我们使用list 操作的时候,如果启用了查询缓存 ,hibernate 将根据当前查询的HQL 语句(及其参数值)计算出一个缓存的key 值;查询结果集,将作为缓存的value 值(但如果查询结果集是一个对象结果集的话,其缓存的value 值是对象的ID 集合,而不是对象集合本身 )。
可以在hibernate 配置文件中添加:
true
以便打开查询缓存。
查询缓存,对对象查询,将缓存其ID 列表;对普通查询,将缓存整个数据集合。所以,对于对象查询,需要配合二级缓存来使用。
在打开了查询缓存之后,需要注意,调用query.list() 操作之前,必须显式调用query.setCachable(true) 来标识某个查询使用缓存。
5. 关于load 、get 、iterate 和list 操作在缓存中的作用
5.1 Load/get
这个方法,用于加载某个对象。如果打开了二级缓存,加载的对象数据将会被缓存。缓存的key 是对象的ID ,缓存的value 是对象的值。
5.2 Iterate
使用iterate 进行查询,分成两种不同的情况:
1、 使用iterate 方法进行对象查询,如createQuery( “ from Student ” ).iterate() ,这个时候,如果打开了二级缓存,其加载的对象集合,将会被缓存。缓存的key 为对象的ID 值,缓存的value 是对象的数据。
2、 使用iterate 方法进行其它查询,如createQuery( “ select name,sex from Student ” ).iterate() ,这个时候,不管有没有打开二级缓存(以及查询缓存),其查询的结果集都不会进行缓存 。
5.3 List
查询缓存只对list 操作起作用 。
使用List 进行查询,也分成两种情况:
1、 使用list 方法进行对象查询,如createQuery( “ from Student ” ).list() ,这个时候,
a) 如果打开了查询缓存,并使用查询缓存(query.setCachable(true); ),hibernate 将对对象的ID 列表进行缓存
b) 如果同时打开了这个对象的二级缓存,那么hibernate 就会将这个对象的数据加入二级缓存中。
2、 使用list 方法进行普通查询,如createQuery( “ select name,sex from Student ” ).list() ,这个时候,
a) 如果打开了查询缓存,并使用查询缓存(query.setCachable(true); ),hibernate 将对查询的结果集进行缓存
b) 不管有没有打开二级缓存,二级缓存的任何设置,对这种类型的查询,不会产生任何影响(因为二级缓存只对对象的数据进行缓存,而不是某些查询结果集)
5.4 Session 如何与二级缓存交互?
Session 接口通过CacheMode 来定制与二级缓存之间的交互方法:
6. 抓取策略
抓取策略,即如何获取数据的策略。
下面以下述模型为例:
班级与学生模型,之间是一对多双向关联:
< hibernate-mapping > < class name = "com.bjsxt.hibernate.one2many.Classes" lazy = "false" batch-size = "10" table = "T_Classes" > < id name = "id" > < generator class = "native" /> </ id > < property name = "name" /> < set name = "students" inverse = "true" lazy = "false" cascade = "all" > < key column = "classesid" /> < one-to-many class = "com.bjsxt.hibernate.one2many.Student" /> </ set > </ class >
< class name = "com.bjsxt.hibernate.one2many.Student" lazy = "false" table = "T_Student" >
< id name = "id" > < generator class = "native" /> </ id > < property name = "name" length = "20" /> < property name = "sex" length = "10" /> < many-to-one lazy = "false" name = "classes" column = "classesid" /> </ class > </ hibernate-mapping > |
· 连接抓取(Join fetching ) - Hibernate 通过 在SELECT 语句使用OUTER JOIN (外连接)来 获得对象的关联实例或者关联集合。 连接抓取策略可以被定义在或集合(如)标签上。这种抓取策略,对load/get 操作有效。
· 如在Student 的标签上设置fetch=”join” ,当我们load/get 一个Student 的时候,其classes 属性的值,将通过一个outter join 连接查询来获取
· 或在Classes 类的标签上设置fetch=”join” ,当我们load/get 一个Classes 类的实例的时候,其集合数据,也是通过一个outter join 连接查询来抓取
· 查询抓取(Select fetching ) - 另外发送一条 SELECT 语句抓取当前对象的关联实体或集合。除非你显式的指定lazy="false" 禁止 延迟抓取(lazy fetching ),否则只有当你真正访问关联关系的时候,才会执行第二条select 语句。 这种抓取策略,设置方法为:fetch=”select” ;
· 如在set 标签上设置fetch=”select”, 下面的查询 :List list = session.createQuery("from Classes cls where id in (1,22)").list(); 将产生如下结果:
Hibernate: select classes0_.id as id7_, classes0_.name as name7_ from T_Classes classes0_ where classes0_.id in (1 , 22)
Hibernate: select students0_.classesid as classesid1_, students0_.id as id1_, students0_.id as id8_0_, students0_.name as name8_0_, students0_.sex as sex8_0_, students0_.classesid as classesid8_0_ from T_Student students0_ where students0_.classesid=?
Hibernate: select students0_.classesid as classesid1_, students0_.id as id1_, students0_.id as id8_0_, students0_.name as name8_0_, students0_.sex as sex8_0_, students0_.classesid as classesid8_0_ from T_Student students0_ where students0_.classesid=?
可见,总共发出:第一,查询 Classes 的数据;第二,因为查询结果集中有两个 Classes 对象,所以针对每个对象,都发出了一个查询语句以便查询其 students 集合的数据。
·
· 子查询抓取(Subselect fetching ) - 另外发送一条SELECT 语句抓取在前面查询到(或者抓取到)的所有实体对象的关联集合。除非你显式的指定lazy="false" 禁止延迟抓取(lazy fetching ),否则只有当你真正访问关联关系的时候,才会执行第二条select 语句。 设置方法是:fetch=”subselect”, 它只能被设置在集合映射的属性上。
· 如在set 标签上设置fetch=”sebselect”, 下面的查询 :List list = session.createQuery("from Classes cls where id in (1,22)").list(); 在list 对象中,将包含两个Classes 对象的实例,假设其集合上配置lazy=”false”, 我们立刻就能看到hibernate 的subselect 抓取策略是:
以下是 hibernate 生成的 SQL 语句:
Hibernate: select classes0_.id as id7_, classes0_.name as name7_ from T_Classes classes0_ where classes0_.id in (1 , 22)
发表评论
-
c3p0数据库连接池自动重连的配置
2012-05-16 23:30 1289在Tomcat中配置c3p0数据库连接池的时候,如果数据库重启 ... -
Hibernate4 有感
2012-05-11 14:23 1700这两天看了看Hibernate4.x ... -
C3P0连接池配置
2012-05-11 10:00 909<c3p0-config> <defau ... -
Hibernate4实战之Hibernate4注解零配置
2012-05-10 15:21 2234@Entity,注册在类头上,将一个类声明为 ... -
Hibernate性能优化(四)转载
2012-01-29 14:58 758本文依照HIBERNATE帮助文档,一些网络书 ... -
Hibernate性能优化(二)转载
2012-01-29 14:55 8091、针对oracle数据库而言,Fetch Size 是设 ... -
Hibernate性能优化(一)转载
2012-01-29 14:52 791有很多人认为Hib ...
相关推荐
《Hibernate性能优化》 在Java应用开发中,Hibernate作为一个强大的对象关系映射(ORM)框架,极大地简化了数据库操作。然而,如果不进行适当的优化,它可能会成为系统性能的瓶颈。以下是一些关于Hibernate性能优化...
珍藏的hibernate性能优化,如果对hibernate进行优化,很详细,是工作和面试的好助手
### Hibernate性能优化方案详解 #### 一、引言 Hibernate作为Java领域中广泛使用的对象关系映射(ORM)框架,其高效性和灵活性受到众多开发者的青睐。然而,不当的设计和配置往往会导致性能瓶颈,严重影响应用程序...
本文将深入探讨Hibernate性能优化中的一个重要概念——一级缓存,并结合给出的压缩包文件“hibernate_cache_level1”,来详细解析一级缓存的工作原理及其优化策略。 一级缓存是Hibernate内置的一种缓存机制,它存在...
Hibernate 性能优化 在 Hibernate 中,性能优化是非常重要的,因为它直接影响着应用程序的效率和可扩展性。在本文中,我们将讨论两个常见的性能优化问题:批量处理和 1+n 问题,并提供相应的解决方法。 问题 1:...
"Hibernate性能优化共9页.pdf.zip" 这个文件标题表明了内容专注于Hibernate框架的性能优化,暗示我们将探讨如何提升使用Hibernate进行数据库操作时的效率。通常,性能优化涉及减少延迟、提高吞吐量、降低资源消耗等...
在进行大型项目开发时,性能优化是至关重要的,特别是对于基于SSH(Struts、Spring、Hibernate)这样的企业级框架的应用。SSH性能优化主要是针对Struts的MVC处理、Spring的依赖注入以及Hibernate的对象关系映射进行...
本文将深入探讨Hibernate缓存的原理、类型及其对性能优化的影响。 ### Hibernate缓存原理 Hibernate缓存主要分为一级缓存和二级缓存。一级缓存,也称为会话缓存(Session Cache),是默认启用的,由Hibernate自动...
的效率低于直接JDBC存取,然而,在经过比较好的性能优化之后,Hibernate的性能还是让人相当满意的, 特别是应用二级缓存之后,甚至可以获得比较不使用缓存的JDBC更好的性能,下面介绍一些通常的 Hibernate的优化策略...
【标题】:优化 Hibernate 性能的关键策略 【描述】:在使用 Hibernate 进行数据库操作时,性能问题时常出现,但通过适当的调整和优化,我们可以显著提高 Hibernate 的执行效率,甚至达到接近或超过直接使用 JDBC ...
在软件开发领域,尤其是在使用Java进行企业级应用开发时,Hibernate作为一款强大的对象关系映射(ORM)框架,其性能优化是至关重要的。以下是对《hibernate性能优化[参考].pdf》内容的详细解读: 1. **数据库优化**...
本话题将深入探讨“Hibernate性能测试代码”,以帮助我们理解如何有效地评估和优化Hibernate在实际应用中的表现。 首先,性能测试是软件开发过程中的关键环节,它旨在确定系统的响应时间、吞吐量和资源利用率等指标...
### Hibernate 性能优化 #### 一、引言 Hibernate 是一款非常强大的对象关系映射(ORM)框架,它能够简化 Java 应用程序与数据库之间的交互过程。然而,对于初次接触 Hibernate 的开发者来说,可能会遇到性能方面...
#### 三、优化Hibernate查询语句 对于复杂的查询操作,优化查询语句本身也是非常重要的。例如,避免使用`in`子句来查询大量数据,因为这可能会导致数据库性能下降。取而代之的是,应该使用更高效的方法,如`...
#### 三、Hibernate 的启动优化 为了解决Hibernate解析HBM文件耗时过长的问题,可以通过将XML文件序列化到本地文件中的方法来减少启动时间。具体做法是将HBM文件转换成二进制格式存储,启动时根据文件的最后修改时间...