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语句.
分享到:
相关推荐
然而,为了提高效率和减少错误,通常会使用ORM(对象关系映射)框架,如Hibernate或MyBatis,它们允许开发者用Java对象直接操作数据库,降低了直接编写SQL的复杂性。 在安全性方面,Java Web应用通常使用HTTPS协议...
同时,项目可能依赖于如Spring、Hibernate这样的框架,它们简化了Web应用的开发和管理。此外,配置文件(如web.xml)定义了应用的部署细节,如Servlet映射、过滤器链和监听器配置。 为了将机器学习模型整合进WAR...
Rocky Linux 8.10内核包
内容概要:本文档详细介绍了如何在Simulink中设计一个满足特定规格的音频带ADC(模数转换器)。首先选择了三阶单环多位量化Σ-Δ调制器作为设计方案,因为这种结构能在音频带宽内提供高噪声整形效果,并且多位量化可以降低量化噪声。接着,文档展示了具体的Simulink建模步骤,包括创建模型、添加各个组件如积分器、量化器、DAC反馈以及连接它们。此外,还进行了参数设计与计算,特别是过采样率和信噪比的估算,并引入了动态元件匹配技术来减少DAC的非线性误差。性能验证部分则通过理想和非理想的仿真实验评估了系统的稳定性和各项指标,最终证明所设计的ADC能够达到预期的技术标准。 适用人群:电子工程专业学生、从事数据转换器研究或开发的技术人员。 使用场景及目标:适用于希望深入了解Σ-Δ调制器的工作原理及其在音频带ADC应用中的具体实现方法的人群。目标是掌握如何利用MATLAB/Simulink工具进行复杂电路的设计与仿真。 其他说明:文中提供了详细的Matlab代码片段用于指导读者完成整个设计流程,同时附带了一些辅助函数帮助分析仿真结果。
内容概要:该题库专为研究生入学考试计算机组成原理科目设计,涵盖名校考研真题、经典教材课后习题、章节题库和模拟试题四大核心模块。名校考研真题精选多所知名高校的计算机组成原理科目及计算机联考真题,并提供详尽解析,帮助考生把握考研命题趋势与难度。经典教材课后习题包括白中英《计算机组成原理》(第5版)和唐朔飞《计算机组成原理》(第2版)的全部课后习题解答,这两部教材被众多名校列为考研指定参考书目。章节题库精选代表性考题,注重基础知识与重难点内容,帮助考生全面掌握考试大纲要求的知识点。模拟试题依据历年考研真题命题规律和热门考点,精心编制两套全真模拟试题,并附标准答案,帮助考生检验学习成果,评估应试能力。 适用人群:计划参加研究生入学考试并报考计算机组成原理科目的考生,尤其是需要系统复习和强化训练的学生。 使用场景及目标:①通过研读名校考研真题,考生可以准确把握考研命题趋势与难度,有效评估复习成效;②通过经典教材课后习题的练习,考生可以巩固基础知识,掌握解题技巧;③通过章节题库的系统练习,考生可以全面掌握考试大纲要求的各个知识点,为备考打下坚实基础;④通过模拟试题的测试,考生可以检验学习成果,评估应试能力,为正式考试做好充分准备。 其他说明:该题库不仅提供详细的题目解析,还涵盖了计算机组成原理的各个方面,包括计算机系统概述、数据表示与运算、存储器分层、指令系统、中央处理器、总线系统和输入输出系统等。考生在使用过程中应结合理论学习与实践操作,注重理解与应用,以提高应试能力和专业知识水平。
__UNI__DB9970A__20250328141034.apk.1
rust for minio
国网台区终端最新规范
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
一个简单的机器学习代码示例,使用的是经典的鸢尾花(Iris)数据集,通过 Scikit-learn 库实现了一个简单的分类模型。这个代码可以帮助你入门机器学习中的分类任务。
pyqt离线包,pyqt-tools离线包
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
SQL常用日期和时间函数整理及在sqlserver测试示例 主要包括 1.查询当前日期GETDATE 2.日期时间加减函数DATEADD 3 返回两个日期中指定的日期部分之间的差值DATEDIFF 4.日期格式转换CONVERT(VARCHAR(10),GETDATE(),120) 5.返回指定日期的年份数值 6.返回指定日期的月份数值 7.返回指定日期的天数数值
GSDML-V2.3-Turck-BL20_E_GW_EN-20160524-010300.xml
T_CPCIF 0225-2022 多聚甲醛.docx
《基于YOLOv8的智能仓储货物堆码倾斜预警系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计
蚕豆脱壳机设计.zip
台区终端电科院送检文档
Y6一39一No23.6D离心通风机 CAD().zip
django自建博客app