`
wcleye
  • 浏览: 10125 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Hibernate From 引发的查询性能问题思考

阅读更多

在 javaeye 上几乎到处可见 hibernate 相关文章,计论它的性能问题也不是一天两天了, 在搜索几乎无结果的情况下,发表这篇文章..

 

由于在项目中使用了hibernate,刚开始使用确实很爽,随着数据量的增加,一条查询语句明显让服务器内存直线上升,hibernate 的性能问题也越来越突出,于是开始优化代码,增加了 fetch_size,batch_size,inverse ,lazy 的配制,性能有了些好转,但是问题还是很明显,

 

后来上网查找,网上有人提出可以取消表之间的关联,查询时用HQL通过标识建立关联,但这样一来项目改动太大,后来无意中看到一篇文章里提到使用 Hibernate查询到的对象都会执行实例化后放入缓存中,于是我猜测,问题可能就在这里了.

 

既然查询到的对象会放入缓存,那如果我直接查询某个字段呢? (想到就做,一直是我的一个习惯),测试发现这对系统性能确实有很大影响了,于是项目中的所有hibernate查询语句,都由查询对象改为查询具体字段,

 

这时让我疑惑的是,既然查询具体字段能提升性能,那hibernate 为什么还要有个from 查询呢?少写几个属性名而牺牲性能怎么想都不划算吧..

 

关于hibernate 的一点疑问,欢迎大家拍砖... :D

分享到:
评论
9 楼 。。。 2008-08-11  
<div class='quote_title'>wcleye 写道</div>
<div class='quote_div'>
<p>在 javaeye 上几乎到处可见 hibernate 相关文章,计论它的性能问题也不是一天两天了, 在搜索几乎无结果的情况下,发表这篇文章.. </p>
<p> </p>
<p>由于在项目中使用了hibernate,刚开始使用确实很爽,随着数据量的增加,一条查询语句明显让服务器内存直线上升,hibernate 的性能问题也越来越突出,于是开始优化代码,增加了 fetch_size,batch_size,inverse ,lazy 的配制,性能有了些好转,但是问题还是很明显,</p>
<p> </p>
<p>后来上网查找,网上有人提出可以取消表之间的关联,查询时用HQL通过标识建立关联,但这样一来项目改动太大,后来无意中看到一篇文章里提到使用<span style='color: #ff0000;'> Hibernate查询到的对象都会执行实例化后放入缓存中</span>,于是我猜测,问题可能就在这里了.</p>
<p> </p>
<p>既然查询到的对象会放入缓存,那如果我直接查询某个字段呢? (想到就做,一直是我的一个习惯),测试发现这对系统性能确实有很大影响了,于是项目中的所有hibernate查询语句,都由查询对象改为查询具体字段,</p>
<p> </p>
<p>这时让我疑惑的是,既然查询具体字段能提升性能,那hibernate 为什么还要有个from 查询呢?少写几个属性名而牺牲性能怎么想都不划算吧.. </p>
<p> </p>
<p>关于hibernate 的一点疑问,欢迎大家拍砖... </p>
</div>
<p><br/>我记得Query、Criteria接口有个方法叫setCatchable(boolean cachable)</p>
<p> </p>
<p>Enable caching of this query result set. </p>
<p>Parameters:<br/>cacheable - Should the query results be cacheable?</p>
<p> </p>
<p> </p>
8 楼 supttkl 2008-08-10  
与二级缓存没关系的全jdbc操作。相信效果会好点。
7 楼 ziyuan 2008-08-08  
优化db再加cache应该差不多了
6 楼 murainwood 2008-08-08  
lazy,bathsize,fetch_size,优化HQL,二级缓存,数据库索引,到最终的表分区..这些Hibernate/Database的优化我做下来之后,最后发现Hibernate的性能,比传说中的要好很多很多
5 楼 laiseeme 2008-08-08  
其实lz做得也是一个优化   比如一个表字段很多 确实没有必要加载所有的字段
相反  一个表的数据可能总会被用到  哪就from放缓存
4 楼 movingboy 2008-08-07  
在一个系统中全部使用Hibernate的object navigation、lazy loading特性或全部使用jdbc直接操纵数据库,是两个极端,一边的优点就是另一边的缺点。在这两个极端之间有一段可供调整的距离,调整的办法就包括楼主提到的那些。我们要做的就是在这两个极端之间找到一个平衡点,而要找到这个平衡点颇不容易,这个点是跟应用的类型、规模等密切相关的,需要自己花时间去尝试、调整。或许这是Hibernate比较难掌握的一个原因吧!

我听到一些朋友抱怨Hibernate性能差,或许就是因为在系统中过多地使用了Hibernate的这些特性。其实Hibernate只是提供了这些特性供你选择,如何使用就看自己了:就好象厨房里准备好了各种配料,但要炒出一碟好菜还得看师傅的手艺。
3 楼 soci 2008-08-07  
wcleye  返字段的话,页面怎么引用呢,我这边用 #p[0] #p[1] 感觉很不好啊。
2 楼 wcleye 2008-08-07  
nihongye 写道
hibernate的这种机制,增加内存的消耗,相应的增加垃圾回收的频率,一般企业应用,做适当的优化后可以被接受。
优化机制各有差异,带来好处得同时可能也带来坏处:fetch_size,batch_size是为了减少发送语句数量(可能带来多余对象的加载),lazy(减少加载对象的同时,可能增加后续语句得产生),二级缓存(减少数据库负荷的同时可能带来垃圾回收频率的增加)等等。优化的关键针对大批量数据加载,多语句发送得功能进行优化。当然终极优化手段,不玩对象,就象你说的,都改为字段,其实就直接回到jdbc,但这算是一个决策吧,比如你手头上只有一台586的机器,让你用hibernate,还要支持100的并发量,你用吗!?

谢谢 nihongye

考虑这问题时我忽略了 hibernate的使用场合 ..
1 楼 nihongye 2008-08-07  
hibernate的这种机制,增加内存的消耗,相应的增加垃圾回收的频率,一般企业应用,做适当的优化后可以被接受。
优化机制各有差异,带来好处得同时可能也带来坏处:fetch_size,batch_size是为了减少发送语句数量(可能带来多余对象的加载),lazy(减少加载对象的同时,可能增加后续语句得产生),二级缓存(减少数据库负荷的同时可能带来垃圾回收频率的增加)等等。优化的关键针对大批量数据加载,多语句发送得功能进行优化。当然终极优化手段,不玩对象,就象你说的,都改为字段,其实就直接回到jdbc,但这算是一个决策吧,比如你手头上只有一台586的机器,让你用hibernate,还要支持100的并发量,你用吗!?

相关推荐

    Hibernate连表查询 Hibernate连表查询

    根据提供的文件信息,我们可以深入探讨Hibernate中的连表查询方法及其应用。下面将详细介绍与标题、描述及部分代码相关的...需要注意的是,在编写连表查询时要充分考虑性能问题,避免因查询复杂度过高而导致性能瓶颈。

    hibernate多表联合查询

    Hibernate作为一款流行的Java持久层框架,提供了一种非常便捷的方式来处理这些问题。本文将详细介绍如何利用Hibernate进行多表联合查询,并通过一个具体的例子来展示其强大功能。 #### 二、多表联合查询概述 多表...

    hibernate实现递归查询

    本文将深入探讨如何使用Hibernate实现递归查询,以解决在数据层次结构中涉及父节点与子节点关系时的问题。递归查询通常用于处理树形结构的数据,例如组织结构、菜单系统或者文件目录等。 首先,我们需要了解递归的...

    Hibernate的MySql查询.rar

    另外,Hibernate的 Criteria API 还可以配合DetachedCriteria使用,实现延迟加载(Lazy Loading),这对于处理大数据量时的性能优化至关重要。延迟加载允许我们在需要时才加载关联的对象,避免一次性加载大量数据...

    hibernate的多态查询

    6. **JPA的多态查询**:如果使用JPA规范,可以使用`@Query`注解和JPQL(Java Persistence Query Language)来编写多态查询,通过`SELECT t FROM ParentType t WHERE t.class IN :classes`这样的语句来实现。...

    hibernate映射和查询

    **hibernate映射与查询** Hibernate 是一个流行的 Java 应用程序开发框架,它提供了一个持久层解决方案,简化了数据库操作。对于初学者来说,理解 Hibernate 的映射和查询机制是至关重要的,因为它们构成了 ...

    hibernate 多表查询

    hibernate 多表查询 hibernate 多表不同于一般的sql嵌套查询,嵌套查询是不支持的,所以必须要配置好才能实现多表!只要配置好了,还是特别好用的

    hibernate性能测试代码

    对于Hibernate,性能测试可能包括查询速度、事务处理效率、内存占用和并发性能等方面。通过测试,我们可以发现潜在的性能瓶颈,并采取相应的优化措施。 在博客链接(由于此处无法直接访问,只能根据描述推断)中,...

    Hibernate_query查询数据表中的一个字段.

    Hibernate提供了一种灵活的查询语言——HQL(Hibernate Query Language),以及 Criteria 查询和 Criteria API,它们都可以用来获取数据表中的特定字段。 二、Hibernate配置 在使用Hibernate进行查询前,首先需要...

    Hibernate进行数据查询

    【Hibernate进行数据查询】 在Java开发中,Hibernate是一个流行的持久化框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。本篇将详细阐述如何使用Hibernate进行数据查询,包括基本数据查询...

    hibernate里面的 两种查询

    在Java的持久化框架Hibernate中,查询是连接应用程序与数据库的关键环节。Hibernate提供了两种主要的查询方式:离线查询(Criteria API)和HQL(Hibernate Query Language)语句查询。这两种查询方法各有特点,适用...

    hibernate 模糊查询 分页

    总的来说,掌握Hibernate的模糊查询和分页技术对于提升数据库操作的灵活性和性能至关重要。通过ORM映射,我们可以更专注于业务逻辑,而不是底层的数据库操作。在实际项目中,结合使用案例和注释可以更好地理解和应用...

    通用的hibernate查询

    【hibernate查询详解】 Hibernate,作为一款强大的Java对象关系映射(ORM)框架,极大地简化了数据库操作。它允许开发者使用面向对象的方式来处理数据库,从而避免了传统的JDBC编码方式带来的复杂性。本篇文章将...

    hibernate分页查询 数据库连接

    此外,优化查询,避免N+1查询问题,合理设计实体关系,都能有效提升Hibernate分页查询的效率。 总结起来,Hibernate的分页查询和数据库连接管理是其强大功能的重要组成部分。正确理解和使用这些特性,能够帮助...

    hibernate将本地SQL查询结果封装成对象

    在某些情况下,本地SQL查询的性能可能会优于HQL,因为它避免了Hibernate对HQL的解析和转换过程。 要将本地SQL查询的结果封装成对象,我们首先需要定义一个映射文件(.hbm.xml),在这个文件中,我们需要指定查询...

    Hibernate分页查询原理解读

    无论是基于LIMIT的分页还是基于ROWNUM的分页,Hibernate都能够很好地适配并提供高效的查询性能。此外,通过使用`Scrollable ResultSet`,Hibernate还可以进一步优化不支持特定分页语法的数据库的查询效率。总之,...

    hibernate实现动态SQL查询

    相比静态SQL,动态SQL更加灵活,能够适应复杂多变的查询需求,避免了硬编码SQL带来的问题,如代码冗余、难以维护等。 三、Hibernate中的动态SQL 在Hibernate中,我们通常使用HQL(Hibernate Query Language)或...

    Hibernate 函数 ,子查询 和原生SQL查询

    **Hibernate函数** ...当ORM无法满足需求时,原生SQL查询则提供了一种灵活的方式,以直接操作数据库的能力来解决特定问题。理解和熟练运用这些特性,对于提升Java开发中的数据库操作效率至关重要。

    hibernate子查询

    然而,正如你所描述的,Hibernate的HQL(Hibernate Query Language)并不直接支持在`FROM`子句后跟一个子查询,这与标准的SQL语法有所差异。在HQL中,子查询通常用在`WHERE`子句或者`SELECT`子句中,而不是作为数据...

    Hibernate分页查询小结

    Hibernate分页查询小结

Global site tag (gtag.js) - Google Analytics