`
- 浏览:
22568 次
- 性别:
- 来自:
北京
-
关于hibernate效率问题讨论的整理
最近在csdn上看到一篇关于对hibernate性能的讨论,感觉里面很多都是nr工作经验的结晶,但还有很多是大众化的观点,现将各观点整理如下:
1.hibernate和jdbc主要区别就是,hibernate先检索缓存中的映射对象( 即hibernate操作的是对象),而jdbc则是直接操作数据库.
2.Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象持久层框架,和App Server,和EJB没有什么必然的联系。Hibernate可以用在任何JDBC可以使用的场合
3.Hibernate是一个和JDBC密切关联的框架,所以Hibernate的兼容性和JDBC驱动,和数据库都有一定的关系,但是和使用它的Java程序,和App Server没有任何关系,也不存在兼容性问题。
还有一点,正确的使用JDBC技术,它的效率一定比hibernate要好,因为hibernate是基于jdbc的技术
--------------------------------------------------------------------------------------------
hibernate 是为了提高了开发人员的开发效率而开发的,但是最后执行也要转化成jdbc。这肯定是以牺牲性能为代价的。这个代价你自己考虑着用咯。
--------------------------------------------------------------------------------------------
单表操作用hib开发效率很高,性能差不了多少。多表用hib,开发效率不晓得,性能大大降低是肯定。大项目一般关联比较多,所以建议不要用hib来处理复杂的业务逻辑。
--------------------------------------------------------------------------------------------
就怕你的项目组对JDBC研究不够,最后还没有hibernate性能优越就惨了。
用DBUtil,最好能优化修改这个框架,那就厉害了。
--------------------------------------------------------------------------------------------
深有体会,用jdbc查询操作数据库快些
理论上讲JDBC效率比Hibernate高,但真正能用好JDBC的程序员并不多,往往最终不如Hibernate。简单讲使用JDBC对程序员要求较高。
--------------------------------------------------------------------------------------------
Hibernate in action:
“However, the more complex and expressive your
domain model, the more you will benefit from using Hibernate; it shines
when dealing with the full complexity of object/relational persistence.”
--------------------------------------------------------------------------------------------
hibernate最大的有点就是延迟加载,避免业务程序直接访问数据库,建设数据库的负载。
对于hibernate的二级缓存的运用更是提升了整个系统的缓冲能力,不过要真正用好hibernate,
对于系统的架构设计来说要求很高,首先需要充分的了解系统中个业务流程的联系,设计完善的数据模型,
构建表直接正确的关系,这样才能保证hibernate在映射的时候,级联缓冲、操作的正确性,
其次如果要使用hibernate的二级缓存,必须先对其hibernate的缓存机制有很好的把握。
不要光认为能使用session的几个api操作数据库,就了解hibernate。如果项目是第一次运用hibernate,
且没有成熟的业务分析,完善的系统框架设计,建议还是不要使用hibernate,毕竟驾驭hibernate还是需要一个时间,
起码1-2年后。能对hibernate有个良好的了解就很不错啦
--------------------------------------------------------------------------------------------
楼上各位都发表了不少高见,说说我的一点看法吧:
大家都从应用程序的性能为出发点来评价hibernate,jdbc甚至ejb,jdo等等常见的持久化技术。
直接说孰优孰劣,还是有点片面,应该结合具体应用。
ejb毫无疑问是分布式环境下持久层的首要选择,这是它天然的特性决定了的:EJB就是为了分布式应用提出的解决方案。但正因为分布式环境在常见系统中并不多见(大部分J2EE应用都是intranet,分布式需求很少,而楼主说的OA,更谈不上分布式了),加上分布式环境的系统设计、分布式数据库设计等等异常复杂,而EJB本身又有一定的复杂性,所以现在SSH组合才如此火爆。可以说,在非分布式应用下用EJB是大材小用,是一种浪费。
抛开分布式应用,再来说说jdbc,hibernate,jdo等等。
可以说,jdbc是整个java数据库应用的基石,不管是hibernate,jdo还是其他持久化框架,其最底层都是基于jdbc的。那么说到这里,在各位心底对三种技术/框架已经有了初步的比较了。
jdbc就是程序员直接通过java.sql及javax.sql类库提供的数据库接口与数据库交互,程序员关注一切数据库细节,包括获取并打开连接,启动事务,进行数据库增删改查,提交,关闭连接,还有异常处理。也就是说,程序员不仅要把握业务(这应该是系统的核心),还要去关注最基本的数据库操作。但灵活性非常高,毕竟你可以把sql,存储过程随时随地的嵌入你的代码中。但hibernate就不行了,你所有可以进行的举动都被约束在映射文件的条条框框之内了
hibernate/jdo是什么?网上说的很滥的一句话就“是对jdbc的轻量级封装”,说白了就是一个第三方类库。但是做了很好的封装,完全可配置化的数据库操作(映射文件),提供了面向对象风格的查询语句(hql)--这很重要,不要忘了java本身是oo的!纯sql语句却不是oo的,是结构化的。相信各位用过hibernate的大侠都体验了再各个关联对象之间随意导航的便利了(user.depart.userset...)吧。至于L1和L2缓存,Lazy等等,这都是hibernate对性能提升的一种机制。
jdo和hibernate类似(我说的是jdo与hibernate的出发点是类似的,技术细节不在讨论之内)。
这样,纯粹从性能角度对比jdbc与hibernate是很片面的。hibernate的初衷并不是提高程序的性能而是简化程序开发流程,让程序员把工作注意力关注在业务处理上---至少hibernate可以不用做异常处理。
回到楼主说你们的经理说hibernate的缓存会带来问题,这只能说没有用好hibernate的缓存,甚至对它的缓存机制停留在模糊认识状态。如果你不在意性能问题,完全可以禁用它的缓存都没问题。
一句话:任何一种技术/框架的出现都是为了解决特定的问题,并非对先前技术的完全颠覆
--------------------------------------------------------------------------------------------
任何一个框架都不会比纯的实现在性能上有优势的..
如你所说的缓存等问题, 固然, hibernate做了相当好的处理, 但是, 这种通用框架, 一般都会为了通用型而损耗一些性能, 这是必然的, 为了良好的描述ORMapping, 必然会有一些你的业务可能用不到的东西仍然在耗费着一些性能, 所以, 当团队开发人员技术能力允许, 时间允许时, 根据业务实现有针对性的数据访问, 数据更新, 缓存, 甚至事务, 对于性能来说是很有效的.
楼主的项目经理考虑的问题完全合理, 一个地区的电信项目, 估计用户不会太少, 那么对应的数据量就不会太砢碜吧....这个时候, 数据库这边的性能以及server的并发能力往往是比较明显的两个瓶颈.
以上纯属个人意见....请高手拍砖.
--------------------------------------------------------------------------------------------
hibernate 效率问题,看你怎么去用,用的当,效率差不了多少,用不当,效率相差肯定很大,当然前提是大量数据,
1w条数据吧,hibernate 级联查询一张表,就会出现效率根本上的问题,但我们实际开发中,跟本不可能要查询1w条数据,
顶多也就100条以下.如果真要查那么多,可能就是你的系统有问题,和你的逻辑有问题,或者那个客户脑子有问题.所以现在考虑,hibernate 可以从根本上解决你的问题..效率应不是我们考试的问题,如果你的做的是电子商务的大型网站,要大量查询数据库,可以考虑一下用ibatis.
--------------------------------------------------------------------------------------------
我虽然对hibernate没实际应用经验,但对jdbc有丰富的使用经验,两者的在概念、技术上还是比较清晰的。
而且刚好有六年的电信省集中业务支撑系统部分功能模块的开发经历,应该也算是所谓的主流ISV里的老兵。
相对于一个地区级的OA其性能要求应该远低于省集中的BOSS,我们经常碰到的一个性能问题就是Db服务器忙死
,而App服务器却在休息,这个可能是完全面向数据库的jdbc大量应用的而导致的一个问题吧!另外为什么不把某些简单功能转为hibernate其在人力培训方面消耗较大,毕竟大环境是业务强于技术的原因有关。不过个人觉得这种o/r技术应该是趋势,只是现在还没有一个统一的、可以完全替换jdbc类技术的技术出现而已
--------------------------------------------------------------------------------------------
批量的update\save\delete,hibernate效率要慢很多
用于查询,正如楼上部分同志所说:如果你一次就要查询w级以上的记录,我个人认为你们的业务逻辑有问题。
通常的小数据量(几十条)查询,由于缓存,还是hibernate快一些的,而这正是我们实际中经常用到的。
最后,使用jdbc和hibernate的开发效率还是差很多的。
--------------------------------------------------------------------------------------------
效率和很多的方面都有关联
怎么就单和hibernate扯上关系了
那个门儿的认识也太浅了哇
--------------------------------------------------------------------------------------------
所谓批量问题,Hibernate还是提供了使用SQL的机会的,它没强制你完全使用HQL。
真正可怕的是外键的映射,比如one-to-one、many-to-one等等。如果你用了,那么性能肯定好不了。用即时加载,会大量的提可能用不到的数据;用延迟加载,会在延迟加载时进行很多次的查询。所以,抛弃这部分功能后,你用Hibernate会快不少。
还有一个地方,就是它默认的是会提取你映射的所有字段。养成这个习惯的话,在一次提取数据比较多的时候,或者字段比较多、字段大小比较大的时候,会有影响。
其他地方的所谓性能损失,无非就是由ResultSet到Bean属性的反射赋值,或者从数据库特定类型到Bean属性类型的类型转换,或者从HQL到SQL的翻译等等一些鸡毛蒜皮的小事了.
--------------------------------------------------------------------------------------------
一看你的项目就是很大,hibernate做聚集性的操作和缓存不同步,数据肯能会不一致。
--------------------------------------------------------------------------------------------
Gavin king就是不想写sql才写的这个框架 哈哈 可能不适合你现在的项目吧
这类框架他只是让程序开发更具对象化了 ORM嘛 可以屏蔽底层数据库的一些差异
但具Gavin king说他的hql语言效率还是很高的 2003年9月,Gavin King在他网站上向全世界发起挑战:谁要是能对一段代码用JDBC开发做到效率比hibernate高好多,就给他100美金。
--------------------------------------------------------------------------------------------
我们公司的项目都用Hibernate,效率还挺高的啊,灵活性也很大,批量操作的效率也很高,只是你们没有把握技巧罢了,
比如插入用batchupdate,删除就直接用原生sql了,当然你用对象去删除效率肯定低了,对于不经常变化的表采用缓存那是必要的,
所以我得出的结论是hibernate的效率并不低,只是你们的优化工作没做好。
--------------------------------------------------------------------------------------------
hibernate 做 批量数据操作时 貌似性能很低 。
批量数据操作时应该用ibatis
hibernate 的延迟加载和缓冲,hql是非常不错的。
hibernate确实要好好的学学。
--------------------------------------------------------------------------------------------
hibernate和jdbc的使用各有自己的优势,最重要的是如何权衡二者的利弊,达到一个最佳的平衡点,这就要求项目经理和架构师
对整个项目进行评估,选择最适合自己的框架,这才是最主要的,最好的东西不一定适合自己
--------------------------------------------------------------------------------------------
hibernate其实它只是做了一层包装底层还是调用的jdbc就是在查询主外建的时候先更具你在关联类的对象去做一个转换这样可能在执
行时间上出现了一定的差额,hibernate的二级缓存就是为了放置预定义的一些sql语句和映射原数据是映射文件中数据的拷贝而预定义
的sql语句是更具映射原数据推倒出来的(这里的映射原数据就是映射文件)和一级缓存就是为了存储用户已经查询出的数据,如果查
询的数据和前一次一样使用hibernate的话不会再和数据库进行交互,直接从缓存中取出数据显示给用户,如果在修改的时候用户修改
前的数据存储在一级缓存中和用户修改的数据进行脏数据对比如果更改过进行提交,如果没有更改过不进行提交,hibernate在做级联
数据处理的时候还是很好的对于和使用jdbc的性质是一样的只是在hibernate中你通过程序给他一个对象在执行数据库语句的时候
hibernate在解析这个对象的标识时可能使用了一点时间如果大量数据时一定会出现时间差异,对于性能有一定的延时。
--------------------------------------------------------------------------------------------
各有各的好啊,项目越大就越应该用Hibernate,不然过度的关注细节,项目就不好做了,后期升级、维护也不好做了。
关注一下,我们的项目中,使用了hibernate,但是基本上和数据库打交道用的都是HQL……不知道这个算不算对hibernate理解不够[我们主要是觉得,使用hiberntae的表关联加载延迟等等很麻烦,所以就主要使用了HQL了],高人们指正
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
**标题:“Hibernate配置连接池整理”** 在Java开发中,数据访问层的性能优化往往离不开高效的数据连接管理,而连接池就是实现这一目标的关键技术。Hibernate作为一款强大的对象关系映射(ORM)框架,它提供了与...
本篇将深入探讨Hibernate的核心概念,以及如何通过提供的源码进行学习与实践。 1. Hibernate概述 Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者使用面向对象的方式处理数据库操作。通过...
本文将深入探讨 Hibernate Synchronizer 的主要功能和使用技巧,以帮助开发者更好地利用这一强大工具。 #### 映射文档编辑器:智能与直观 Hibernate Synchronizer 的核心优势之一在于其为映射文档提供的专业化编辑...
第三部分探讨了Hibernate的二级缓存总结整理。Hibernate二级缓存主要是用来减少数据库的压力,提高应用程序的性能。在这一部分,作者可能讲解了二级缓存的工作原理,如何配置,以及它的使用场景和限制。 第四部分...
在这个整理文档中,我们将深入探讨Hibernate的核心概念、映射机制以及各种数据类型的对应关系。 首先,Hibernate的核心理念是通过对象模型与数据库表之间的映射,将数据库操作转化为对Java对象的操作。它提供了XML...
总的来说,理解和掌握Struts1&2、Spring和Hibernate框架是Java Web开发的重要一步,它们的组合使用能够大大提高开发效率,降低项目复杂性。随着技术的发展,现代Web应用可能更多地转向Spring Boot和Spring MVC,但...
在这四天的学习笔记中,我们将深入探讨Hibernate的核心概念、配置、实体管理以及查询语言,帮助你全面掌握这个流行的持久层框架。 一、Hibernate 概述 Hibernate 提供了一种映射机制,将Java类与数据库表进行对应,...
使用Hibernate的show_sql属性可以帮助我们查看生成的SQL,通过对比实际数据库操作,找出问题所在。此外,还要注意N+1查询问题和懒加载陷阱,避免性能瓶颈。 SSH框架间的协同工作也是调试的重点。例如,Spring与...
再者,"Hibernate笔记.pdf"可能是一位资深开发者或讲师整理的个人学习笔记,通常会包含一些实践经验和技巧。这类笔记往往能提供一些官方文档中未提及的实用小贴士,如常见错误的解决方案、最佳实践以及一些性能调优...
本篇文章将对Hibernate的一些关键特性进行探讨,包括存取JSON数据的新思路、关系映射的总结、二级缓存的运用、自定义类型以及对象序列化的实现。 1. **Hibernate存取JSON数据(换一种思路来存取数据)** 在某些...
在实际项目中,合理地利用日志系统,能够有效地排查问题,提高开发效率。 在学习这个资源包时,你需要逐步掌握以下内容: 1. Hibernate的核心概念:实体、会话、事务、缓存等。 2. 注解驱动编程的使用,理解各种...
这是一份由个人在观看邹波老师的Hibernate视频教程后精心整理的学习笔记,旨在帮助初学者和有一定基础的程序员更好地理解和运用Hibernate。Hibernate作为Java领域广泛使用的持久化框架,它极大地简化了数据库操作,...
- **Hibernate in Spring**:探讨了Hibernate与Spring框架集成的最佳实践。 - **编后赘言**:作者的一些思考和个人经验分享。 #### 三、关键技术点详解 - **Hibernate配置**:这是启动Hibernate应用的第一步。...
这篇笔记主要记录了在使用JavaScript、ExtJS、Struts和Hibernate等技术时的一些问题及其解决方法。 首先,关于JavaScript读写XML文件的问题。JavaScript可以用于客户端的XML处理,但受限于安全策略,无法直接修改...
“hibernate 增删改查的操作”这个标题表明我们要讨论的是使用Hibernate框架在Java中执行数据库的基本操作,包括创建(Create)、读取(Read)、更新(Update)和删除(Delete),通常简称为CRUD操作。 **描述分析...
- **性能优化**:探讨了Hibernate在实际应用中的性能调优方法,包括二级缓存、批量加载、延迟加载等高级特性。 - **关系映射**:详细介绍了实体间的关联关系(一对一、一对多、多对多)在Hibernate中的映射方式。 - ...
"struts2_spring_hibernat_面试题目.doc"包含了关于这三个框架的常见面试问题,涵盖了各个层面,包括配置、异常处理、性能优化等方面。"hibernate面试题.doc"则专门针对Hibernate,可能包括实体类设计、事务管理、...
此外,该博客可能还讨论了不同许可证之间的兼容性问题。有些许可证之间可能存在冲突,比如GPL和非GPL许可证的混合使用可能导致复杂的问题。因此,开发者在选择和集成开源框架时,必须谨慎考虑许可证之间的相互作用,...
这个“mvc项目搭建工具整理.zip”文件很可能是包含了一些关于如何在Java Web环境中搭建MVC项目的资源和工具。下面,我们将深入探讨MVC架构以及与Java Web相关的工具和技术。 1. **MVC架构**: MVC模式的核心思想是...
这篇博客是关于Java 5.0新特性——Annotation的系统学习与整理笔记,通过讲解与实例,深入探讨了注解在Junit、Spring和Hibernate中的应用。 首先,注解是一种声明式的编程元素,它可以附加到类、接口、方法、变量等...