`
dev_liu
  • 浏览: 111025 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

Hibernate性能优化策略 (zt)

阅读更多
Hibernate性能优化策略

1.     简介

版本:Hibernate3.2

1.1  目的

1.2  范围

1.3  定义、首字母缩写词和缩略语

1.4  参考资料

1.5  概述

2.     缓存策略

2.1  什么是缓存?

Hibernate将数据临时存放在内存中,以便加快数据的存取速度。为此,我们可以想象,缓存的实现,就类似于一个Map对象,首先需要一个key,以便定位相应被缓存的数据,而它的value值,便是被缓存的数据。

<o:p> </o:p>

2.2  一级缓存

session级别的缓存,随着session的关闭而消失,load/iterator操作,会从一级缓存中查找数据,如果找不到,再到数据库里面查找。Query.list操作,如果没有配置查询缓存,将直接从数据库中获取数据。

<o:p> </o:p>

2.3  二级缓存

SessionFactory级别的缓存。默认的情况下是打开的。这是一个全局缓存策略。它可以对对象的数据进行全局缓存

2.4  查询缓存

即对查询的结果集进行缓存处理,以便下次相同条件相同HQL的情况下可以直接从缓存中获取数据。

<o:p> </o:p>

3.     二级缓存

3.1.1           如何打开二级缓存?

需要更改hibernate配置文件:

1、  打开二级缓存(默认情况下是打开的)

a)       <property name="hibernate.cache.use_second_level_cache">true</property>

2、  指定缓存策略提供商

a)       <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

<o:p> </o:p>

3.1.2           二级缓存是对对象数据的缓存

为了让hibernate对对象进行缓存,你必须指定需要缓存哪些类的对象,这有两种方法可以达到这个目的:

1、  hibernate配置文件中指定,如

<class-cache class="com.bjsxt.hibernate.User2" usage="read-only" />

2、  在类的映射文件中(即<class/>标签下指定),如

<cache usage=read-only/>

<o:p> </o:p>

如果你打开了对对象的缓存,那么,所有对这个对象的查询操作的结果,都会被缓存起来。Hibernate将使用对象的键值作为缓存的key值,对象的数据作为缓存的value值。

打开了对象缓存,只有在对对象进行查询操作的时候,才会起作用,如createQuery(from Student).iterate()

<o:p> </o:p>

3.1.3           缓存策略

缓存有几种形式,可以在映射文件中配置:read-only(只读,适用于很少变更的静态数据/历史数据)nonstrict-read-writeread-write(比较普遍的形式,效率一般)transactional(JTA中,且支持的缓存产品较少)

<o:p> </o:p>

<o:p> </o:p>

4.     查询缓存

<o:p> </o:p>

查询缓存的作用,是对list操作的查询结果集进行缓存!

<o:p> </o:p>

我们使用list操作的时候,如果启用了查询缓存hibernate将根据当前查询的HQL语句(及其参数值)计算出一个缓存的key值;查询结果集,将作为缓存的value值(但如果查询结果集是一个对象结果集的话,其缓存的value值是对象的ID集合,而不是对象集合本身)。

<o:p> </o:p>

可以在hibernate配置文件中添加:

<property name="hibernate.cache.use_query_cache">true</property><o:p></o:p>

以便打开查询缓存。

<o:p> </o:p>

查询缓存,对对象查询,将缓存其ID列表;对普通查询,将缓存整个数据集合。所以,对于对象查询,需要配合二级缓存来使用。

<o:p> </o:p>

在打开了查询缓存之后,需要注意,调用query.list()操作之前,必须显式调用query.setCachable(true)来标识某个查询使用缓存。

<o:p> </o:p>

<o:p> </o:p>

5.     关于loadgetiteratelist操作在缓存中的作用

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(),这个时候,不管有没有打开二级缓存(以及查询缓存),其查询的结果集都不会进行缓存

<o:p> </o:p>

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)       不管有没有打开二级缓存,二级缓存的任何设置,对这种类型的查询,不会产生任何影响(因为二级缓存只对对象的数据进行缓存,而不是某些查询结果集)

<o:p> </o:p>

<o:p> </o:p>

5.4  Session如何与二级缓存交互?

Session接口通过CacheMode来定制与二级缓存之间的交互方法:

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

6.     抓取策略

<o:p> </o:p>

抓取策略,即如何获取数据的策略。

<o:p> </o:p>

下面以下述模型为例:

<o:p> </o:p>

班级与学生模型,之间是一对多双向关联:

<o:p> </o:p>

<hibernate-mapping><o:p></o:p>

    <class name="com.bjsxt.hibernate.one2many.Classes" lazy="false" batch-size="10" table="T_Classes"><o:p></o:p>

       <id name="id"><o:p></o:p>

           <generator class="native"/><o:p></o:p>

       </id><o:p></o:p>

       <property name="name"/><o:p></o:p>

       <set name="students" inverse="true" lazy="false" cascade="all" ><o:p></o:p>

           <key column="classesid"/><o:p></o:p>

           <one-to-many class="com.bjsxt.hibernate.one2many.Student"/><o:p></o:p>

       </set><o:p></o:p>

    </class><o:p></o:p>

    <o:p></o:p>

    <class name="com.bjsxt.hibernate.one2many.Student" lazy="false" table="T_Student"><o:p></o:p>

       <o:p></o:p>

       <id name="id"><o:p></o:p>

           <generator class="native"/><o:p></o:p>

       </id><o:p></o:p>

       <property name="name" length="20"/><o:p></o:p>

       <property name="sex" length="10" /><o:p></o:p>

       <many-to-one lazy="false" name="classes" column="classesid"/><o:p></o:p>

    </class><o:p></o:p>

</hibernate-mapping>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

·         连接抓取(Join fetching - Hibernate通过 在SELECT语句使用OUTER JOIN(外连接)来 获得对象的关联实例或者关联集合。 连接抓取策略可以被定义在<many-to-one/>或集合(如<set/>)标签上。这种抓取策略,对load/get操作有效。

·         如在Student<many-to-one/>标签上设置fetch=”join”,当我们load/get一个Student的时候,其classes属性的值,将通过一个outter join连接查询来获取

·         或在Classes类的<set />标签上设置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)<o:p></o:p>

<o:p> </o:p>

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=?<o:p></o:p>

<o:p> </o:p>

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=?<o:p></o:p>

可见,总共发出:第一,查询Classes的数据;第二,因为查询结果集中有两个Classes对象,所以针对每个对象,都发出了一个查询语句以便查询其students集合的数据。<o:p></o:p>

·         <o:p> </o:p>

·         子查询抓取(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”,我们立刻就能看到hibernatesubselect抓取策略是:

以下是hibernate生成的SQL语句:<o:p></o:p>

Hibernate: select classes0_.id as id7_, classes0_.name as name7_ from T_Classes classes0_ where classes0_.id in (1 , 22)<o:p></o:p>

<o:p> </o:p>

分享到:
评论

相关推荐

    Hibernate性能优化研究.pdf

    本文旨在通过对Hibernate的深入研究,探讨影响其性能的各种因素,并提出相应的优化策略。 #### 二、O/R Mapping及Hibernate简介 ##### 2.1 O/R Mapping O/R Mapping是一种编程技术,用于在关系数据库和对象之间...

    Hibernate性能优化

    《Hibernate性能优化》 ...以上是Hibernate性能优化的一些核心点,实践中还需要结合具体项目进行调整和测试,找到最适合的优化策略。学习和理解这些知识点,有助于开发出更高效、更稳定的Java应用程序。

    hibernate性能优化

    珍藏的hibernate性能优化,如果对hibernate进行优化,很详细,是工作和面试的好助手

    hibernate性能优化方案

    综上所述,Hibernate性能优化涉及多个层面,包括但不限于数据库设计、HQL编写、API选择、配置参数调整、缓存管理、延迟加载以及事务控制策略等。通过对这些方面的综合考量和优化,可以极大地提升Hibernate应用程序的...

    Hibernate性能优化:一级缓存

    本文将深入探讨Hibernate性能优化中的一个重要概念——一级缓存,并结合给出的压缩包文件“hibernate_cache_level1”,来详细解析一级缓存的工作原理及其优化策略。 一级缓存是Hibernate内置的一种缓存机制,它存在...

    Hibernate性能优化共9页.pdf.zip

    "Hibernate性能优化共9页.pdf.zip" 这个文件标题表明了内容专注于Hibernate框架的性能优化,暗示我们将探讨如何提升使用Hibernate进行数据库操作时的效率。通常,性能优化涉及减少延迟、提高吞吐量、降低资源消耗等...

    hibernate性能优化.doc

    总之,优化Hibernate性能涉及多个层面,包括数据库设计、代码结构、配置参数、缓存策略等,需要结合实际情况综合考虑,持续监控和调整以达到最佳效果。在实践中,应不断学习和探索,以提升系统的整体性能。

    Hibernate3性能优化 Hibernate_regerence3.12

    有很多人认为Hibernate天生效率比较低,确实,在普遍情况下,需要将执行转换为SQL语句的 Hibernate 的效率低于直接JDBC存取,然而,在经过比较好...Hibernate的优化策略: 1.抓取优化 2.二级缓存 3.批量数据操作 4.杂项

    Struts Spring Hibernate性能优化

    在进行大型项目开发时,性能优化是至关重要的,特别是对于基于SSH(Struts、Spring、Hibernate)这样的企业级框架的应用。SSH性能优化主要是针对Struts的MVC处理、Spring的依赖注入以及Hibernate的对象关系映射进行...

    hibernate性能优化[参考].pdf

    在软件开发领域,尤其是在使用Java进行企业级应用开发时,Hibernate作为一款强大的对象关系映射(ORM)框架,其性能优化是至关重要的。以下是对《hibernate性能优化[参考].pdf》内容的详细解读: 1. **数据库优化**...

    Hibernate缓存,性能优化

    综上所述,Hibernate缓存机制是提升应用性能的重要手段,通过合理配置缓存策略、优化查询方式、管理数据库连接以及实施有效的监控和调优措施,可以显著提高Hibernate应用的运行效率和用户体验。然而,缓存的使用并非...

    hibernate-性能优化

    【标题】:优化 Hibernate 性能的关键策略 【描述】:在使用 Hibernate 进行数据库操作时,性能问题时常出现,但通过适当的调整和优化,我们可以显著提高 Hibernate 的执行效率,甚至达到接近或超过直接使用 JDBC ...

    Hibernate性能优化:二级缓存

    在Java世界中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。然而,随着应用规模的增长,性能优化变得...在实际应用中,需要结合业务场景和性能测试,不断调整优化策略,以达到最佳性能。

    hibernate性能测试代码

    本话题将深入探讨“Hibernate性能测试代码”,以帮助我们理解如何有效地评估和优化Hibernate在实际应用中的表现。 首先,性能测试是软件开发过程中的关键环节,它旨在确定系统的响应时间、吞吐量和资源利用率等指标...

    Hibernate 性能优化

    ### Hibernate 性能优化 #### 一、引言 Hibernate 是一款非常强大的对象关系映射(ORM)框架,它能够简化 Java 应用程序与数据库之间的交互过程。然而,对于初次接触 Hibernate 的开发者来说,可能会遇到性能方面...

Global site tag (gtag.js) - Google Analytics