Hibernate主要是使用OO思想存取数据库,根据数据库表自动映射对象,代码全部转为针对对象的操作,语义表达相比原来
的rs要强很多。Hibernate的关键是有针对数据库表的设计和编程转变为针对业务对象的设计和编程。
但是Hibernate有一个缺陷,可能是由于要把数据库表映射为对象,使用Hibernate可能会出现严重的性能问题,速度很慢等情况。
参考资料:
大家来一起讨论如何通过Hibernate提高访问数据库的速度
http://www.jdon.com/jive/thread.jsp?forum=16&thread=28484
最近本人正搞一个项目,项目中我们用到了struts1.2+hibernate3
由于关系复杂表和表之间的关系很多,在很多地方把lazy都设置false,所以导致数据一加载很慢,而且查询一条数据更是非常的慢,由于项目时间比较短,时间很紧,所以一直都在忙着实现功能,还没来的急进行优化
今天我设置下二级缓存 效果不大,我想肯定还有更好的方法,比如Hibernate.initialize 还有迫切连接等方法
请大家多给点意见,最好给一个详细的技术文章
谢谢大家~!
re:
首先必须明白:性能问题完全取决于你的业务设计问题,而不是某个具体架构技术的性能。
你的业务设计采取面向数据表分析,导致关系复杂表和表之间的关系很多,这是你的系统性能问题最本质原因,只有使用DDD重新分析你的系统,才从根本上改观。
其他只是一些小修小打的微调,不能根本解决问题。
如果不能掌握Domain Model的设计方式,使用ORM是比较艰难的。
re:
很同意,有些人主动或被动把SQL搞得很复杂,这本身就背离了OR MAPPING的初衷,也背离了持久曾的实质.
好的DB设计不会有复杂的SQl代码,基本就是简单的CRUD语句,在它上层再用一层Service实现复杂的业务机制.当然,这必须在领域对象已经清晰的情况下.
re:
使用Hibernate前提必须掌握领域建模的方法,也就是Evans DDD,至少了解类关联的意思和本质。
我们以前很多程序员都是基于数据表编程的思路,现在使用了Hibernate这样的ORM,Hibernate替代了数据表,或者说;插在了数据表和程序员之间,程序员就看不见数据表了,程序员必须学会和Hibernate代表的对象打交道,如果还是念念不忘数据表,那么每次用Hibernate,总是要转个弯,就不自然而且不方便。
换句话说:只有程序员真正掌握面向对象的分析设计和编程,才会觉得使用Hiberante等ORM工具是一个最简单的方式,否则,反而觉得数据表JDBC是一个简单的解决方式。
所以,可以从是否善用Hibernate看出程序员的OO素质。虽然你的单位是电信大单位,但是OO作为一个与面向过程全新的革命性技术和思想,它是挑战和颠覆面向过程的思维的,而我们国内以前大学教育以及实践如Delphi/VB等等都是传统的面向过程思维,虽然他们做过大项目,经验丰富,但是也吃了很多苦头,只是朴素地直觉认为程序要灵活,但是没有上升为OO理论,因为掌握OO是对自己过去经验和习惯的挑战,是对自己的挑战,又有几个人做到,象你这样舒服的大单位,谁有没事折磨自己,挑战自己呢?
re:
呵呵,我也是做电信项目的,看了一下,发表一下自己的观点,电信项目的数据量大,表的数目也比较多,业务逻辑也比较复杂,如果用oo设计,对象之间的关联比较多,而且比较复杂,所以load一条数据非常慢,另外,需求变更比较频繁,往往在项目过程进行中需要进行表的改动,面向对象有可能需要重新设计对象之间的关系,维护起来不方便,而且在数据查询优化方面也利用不到数据库的优势,导致查询数度比较慢,个人观点是对象分析可以帮助我们深入了解对象与对象之间的关系,也就是表与表之间的关联,但实际开发中可能就需要将对象关系降低,而且用户只关心他需要的数据,就是视图,我不否认oo的优势,但实际开发另当别论,不要因为oo而oo,另外提一下,上次公司有个项目用hib,差点死掉.......(说的不对别骂哦,呵呵^_^)
re:
这个世界上的软件并不永远只有CRUD这种操作,统计/分析/报表等等同样是必不可少的,如果捆绑上hibernate,就如j10a所说,绝对会在性能上走向死亡。
通常我会在项目中同时使用hibernate和jdbc,当然,会有自己的封装。
单纯做ORM,我倒是觉得itabis是个更好的选择。
re:
我很认同banq。之前,有3、4个项目使用hibernate。问题很多,一是项目组没有非常熟悉hibernate组员,二是我们对业务领域根本没有分析,基本上是沿袭老思路,建库,创表,编代码。需求在不断变更,问题越来越多。
现在,这个项目,我们在业务领域分析方面,做了一点小工作,并且借鉴spring的思路,多在行为定义,行为组装上下功夫,尽量解耦行为与数据、行为与数据关系。应该说,比原先有所进步。我相信,随着项目组对hibernate的深入,对OO的深入,对业务领域分析的深入,我们的路会越来越清晰。
re:
我也很认同banq的观念,因为从数据表建模的思路转变到对象建模思路,我也有过这样的经历,以前设计系统时都是从数据库建模开始,这样的问题是如果你采用对象的方式编码的话,很多问题都出来了,结果项目的代码也被改动的的很多,而且维护也很麻烦。现在我如果从头设计一个系统,我往往先是业务对象建模,业务对象先运行起来,在用代理模式或装饰模式给业务对象增加防问数据库的能力。这样代码改动量虽然没见得减少,但改动的范围缩小了,控制在几个类之间,而且便于维护。
re:
不得不承认,web2.0时代已经来临,这个强调性能、敏捷的时代,hibernate会死的更早。呼唤一个崭新的框架! OO很重要,但过于强调就是“女人的裹脚布”了,又臭又长!
re:
其实,没有必要争论是JDBC,HIBERNATE哪个效率高,哪个好,同样的问题不同人的解决结果也未必一样,有些人用JDBC写的SQL访问数据库未必比HIBERNATE快,所以人是关键・
几个月前,一次经历:由于设计问题,使客户一次操作产生几千条SQL,这样明显是设计问题,后来采用工具+DEBUG,拦截宋庆龄,看看是什么地方产生的问题,最后找出问题,把几千条变为几条,性能提高越30倍。
最夸张的是有个同事发了HIBERNATE产出的SQL让我查错,竟然是几页WORD的SQL,我没有能力找错误,这问题在什么地方,在设计!
所以用HIBERNATE,你是不是准备好了,公司的技术储备是不是可以,是不是已经从数据分析转道对象,领域分析了,是否清楚如何设计合理的对象关系,所以HIBERNATE只是O/R工具,他需要分析设计先行的基础!
re:
彭先生,说的非常用理,只有你采用面向对象思想分析系统,重构系统,才能使Hibernate体现的淋漓尽致,如果你的系统还是采用数据库方式驱动设计,而不采用DDD设计,再怎么优化还是有问题,原因何在,原因出在现在大部分系统有人还是没能走出数据库驱动方式开发系统阴影,还是用面向对象的语言而不是思想开发系统,从而使系统本质上不是面向对象的.因此还是建议重构吧.
re:
我对hb不是很了解,正在学习中,简单说一下自己的想法:
系统开发过程中,问题来自多方面,比如说用了hb,查询性能下降很多,
可能会是多中原因造成的,比如,开发人员熟悉hb的程度够不够,能不能对HQL语句进行优化;对hb的长处和短处是否理解,知道什么情况下,使用hb的缓存会提高性能;
另外,还有设计的问题,对象的粒度是否合适,类和表怎样映射才更合理...
总之一句话,你对hb理解到什么程度,写出的程序的性能也会不同!
re:
你把lazy设成true就可以,当lazy为false的时候,数据抓取会抓出一棵树,所以会很慢.把lazy设成 true以后你可以根据自己具体需要来抓数据,具体可参考hibernate手册的fetch语句.
分享到:
相关推荐
接下来,我们谈谈Hibernate与数据库事务的关系。在Hibernate中,通常一个Session对应一个数据库事务。默认情况下,Flush操作会在事务提交前进行,确保事务内的所有操作都能正确反映到数据库。如果在事务中遇到异常,...
Hibernate 支持各种关联映射,如一对一、一对多、多对一和多对多。理解这些关联关系的建立和查询,能够帮助开发者设计出更灵活的数据模型。 8. **缓存机制**: Hibernate 提供了第一级缓存和第二级缓存,以及查询...
Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者使用面向对象的方式来操作数据库。这个框架将数据库操作转化为对Java对象的操作,...通过上述步骤,你可以更好地了解和应用Hibernate进行数据库操作。
首先,让我们详细了解一下Hibernate4.0。在这一版本中,Hibernate引入了一些重要的改进和新特性。例如,对JPA 2.0规范的全面支持,使得开发者能够更方便地利用Java持久化API。此外,还增强了对批处理操作的支持,...
hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,包含4个说明文档,分别详细解说了hibernate...
- **现代构建流程**: 了解在当前环境中如何有效地使用 Hibernate 进行开发。 - **Java 8 特性**: 掌握 Java 8 新特性与 Hibernate 结合的方法。 - **生命周期集成**: 理解如何将业务逻辑融入到持久化生命周期中。 - ...
3. **Hibernate 中文API文档.chm**:这是Hibernate的中文API参考手册,对每个类、接口和方法的详细说明,对于查阅具体功能和方法的使用非常有帮助。 4. **Hibernate3.2.chm**:这个文件可能包含了Hibernate 3.2版本...
**标题:“Hibernate双向一对多经典实例”** 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者能够用面向对象的方式处理数据。本实例将聚焦于Hibernate中的一对多关系...
"Hibernate入门到精通" Hibernate 是一个基于Java的ORM(Object-Relational Mapping,对象关系映射)框架,它提供了一种简洁高效的方式来访问和操作关系数据库。下面是 Hibernate 的主要知识点: Hibernate 简介 ...
1. Hibernate ORM框架:Hibernate是一个流行的Java ORM框架,它通过XML或注解的方式将Java对象与数据库表进行映射,使得开发者无需编写大量的SQL语句,就能完成对数据库的操作。它支持多种数据库,如MySQL、Oracle、...
对于开源项目如Hibernate,了解许可证信息至关重要,因为它定义了开发者在商业应用中使用这些库的限制和条件。 使用Hibernate3时,开发者首先需要配置Hibernate的XML配置文件(通常是hibernate.cfg.xml),其中包含...
### Hibernate实战知识点解析 #### 一、书籍简介与评价概览 《Hibernate实战》是一部...通过本书的学习,不仅可以快速掌握Hibernate的基本用法,还能深入了解其背后的原理和最佳实践,从而更好地应用于实际项目中。
首先,你需要了解Hibernate的核心概念。ORM是Hibernate的核心特性,它通过映射XML或注解将Java类与数据库表关联起来。这使得你可以像操作普通Java对象一样操作数据库记录。例如,创建一个User类,然后通过Hibernate...
hibernate 5.2.15 hibernate 5.2.15 hibernate 5.2.15 hibernate 5.2.15 hibernate 5.2.15hibernate 5.2.15
通过学习Hibernate 5.2.9的源码,可以深入了解其内部实现,包括查询解析、结果集转换、缓存策略等细节,有助于提升开发技能。同时,了解并掌握这些知识点,将极大地提高Java应用的开发效率和质量。
在使用时,开发者需要根据自己的Hibernate版本选择相应的方言类,并在Hibernate配置文件中指定,例如: ```xml <property name="hibernate.dialect">com.example.DmDialect4_0</property> ``` 总的来说,“达梦...
10. **集合映射**:Hibernate支持多种集合类型(如List、Set、Map等)与数据库表中的多对一、一对多、多对多关系的映射。 11. **事件监听器**:Hibernate允许注册事件监听器,对持久化对象的各种操作(如保存、更新...
【标题】"hibernate-release-4.1.4" 是Hibernate...通过深入研究这个压缩包,开发者不仅可以了解Hibernate的基本用法,还能掌握更高级的功能,如事务管理、缓存策略、查询语言(HQL)等,从而提升开发效率和代码质量。
《Hibernate实战》这本书深入浅出地探讨了Java领域中广泛使用的对象关系映射...通过学习,读者不仅可以了解到Hibernate的工作原理,还能掌握实际开发中的最佳实践,从而更好地利用Hibernate提升开发效率和项目质量。
《深入剖析Hibernate 3.2源代码...通过深入学习Hibernate 3.2的源代码,开发者不仅可以了解其实现原理,还能在遇到问题时更快定位,进行定制化开发。同时,这也有助于理解ORM框架的工作方式,提升软件设计和开发能力。