隨筆-199  評(píng)論-203  文章-11  trackbacks-0
            Hibernate在解決性能問(wèn)題方面做得非常好。有了它的緩存機(jī)制,使用第三方緩存和數(shù)據(jù)庫(kù)連接池,就較好的解決的性能問(wèn)題。但這些還不夠,hibernate給了開(kāi)發(fā)者足夠的自由,讓開(kāi)發(fā)者自己去控制性能問(wèn)題。

              學(xué)習(xí)了一段時(shí)間的ibatis,我覺(jué)得hibernate有著ibatis無(wú)法替代的優(yōu)勢(shì)。

              1、開(kāi)發(fā)者都知道,hibernate讓我們以oo的方式操作數(shù)據(jù)庫(kù),這讓我們看到了hibernate的強(qiáng)大之處,體驗(yàn)到操作數(shù)據(jù)的方便。但Gavin King說(shuō),hibernate最耀眼之處是hibernate的緩存機(jī)制,而不是以oo的方式操作數(shù)據(jù)庫(kù)。Hibernate的緩存機(jī)制不外乎是一級(jí)緩存session,二級(jí)緩存sessionFactory,和第三方緩存如ehcache.也就是hibernate的最強(qiáng)大的地方是它的緩存,理解了這個(gè)才能真正的理解hibernate.緩存實(shí)在太難了,我至今未能真正理解。

              2、可維護(hù)性:ibatis宣揚(yáng)寫(xiě)sql語(yǔ)句,它將sql語(yǔ)句放進(jìn)一個(gè)單獨(dú)的xml文件,這種方式贏得了很多開(kāi)發(fā)者的喜愛(ài),一句話(huà),方便維護(hù)。但hibernate同樣具有這種功能,而且比ibatis更加強(qiáng)大。Hibernate的命名查詢(xún)/命名參數(shù)查詢(xún),就是將hql語(yǔ)句放在一個(gè)單獨(dú)的xml文件之中,它仍然讓人們以面向?qū)ο蟮姆绞饺ゲ倏v數(shù)據(jù),這得到大量遵循oo方式開(kāi)發(fā)者的喜愛(ài),而不用在以oo的方式寫(xiě)著代碼的同時(shí),然后再轉(zhuǎn)變思維,用面向關(guān)系的方式去寫(xiě)那些sql語(yǔ)句。但hibernate不僅做了這些,它的native sql查詢(xún)方式,完全滿(mǎn)足sql語(yǔ)句的偏愛(ài)者,它像ibatis一樣,將sql語(yǔ)句放在配置文件之中。

              3、性能:我堅(jiān)信,hibernate性能問(wèn)題不是問(wèn)題。想想那么多大中小項(xiàng)目都在使用hibernate,你還懷疑hibernate的性能嗎?spring整合hibernate之后,在真正性能瓶頸的地方,完全可以使用spring集成的jdbc,或直接寫(xiě)存儲(chǔ)過(guò)程得了。但首先得確認(rèn),這實(shí)在是性能瓶頸的地方,我想,不應(yīng)想當(dāng)然的認(rèn)為性能的問(wèn)題,所謂的性能問(wèn)題阻撓了很多人。

              我認(rèn)為,性能的好壞無(wú)外是發(fā)送sql語(yǔ)句的多少而已。性能好,發(fā)送的sql語(yǔ)句少,性能差,就是發(fā)送大量的sql語(yǔ)句。Hibernate在解決性能問(wèn)題方面做得非常好。

              有了它的緩存機(jī)制,使用第三方緩存和數(shù)據(jù)庫(kù)連接池,就較好的解決的性能問(wèn)題。

              但這些還不夠,hibernate給了開(kāi)發(fā)者足夠的自由,讓開(kāi)發(fā)者自己去控制性能問(wèn)題。

              我認(rèn)為開(kāi)發(fā)者可以在以下幾個(gè)方面自行調(diào)優(yōu):

              a、在查詢(xún)字符串中,應(yīng)該總是使用jdbc的占位符?,或使用使用命名參數(shù):,不要自查詢(xún)中使用字符串值來(lái)代替非常量值。

              b、Flush會(huì)影響性能,頻繁刷新影響性能,盡量減少不必要的刷新。

              c、Cascade策略,在幾對(duì)幾的關(guān)系,正確設(shè)置cascade策略,想清楚在操作對(duì)象A的同時(shí)是否需要級(jí)聯(lián)操作對(duì)象B,比如在one to many的父子關(guān)系中,刪除了父親one,需級(jí)聯(lián)刪除子many,這時(shí)的one這端可設(shè)置cascade = “delete”,這樣在刪除one時(shí),會(huì)自動(dòng)刪除子,但對(duì)子的操作不會(huì)影響父。Cascade還有其他的屬性值,只要設(shè)置正確,可提升性能。

              d、lazy策略,正確設(shè)置延遲加載策略同樣會(huì)提升性能,在one to many或many to many中,通常總應(yīng)該延遲加載many的一方的到內(nèi)存。設(shè)置了lazy = “true”,首先發(fā)送sql語(yǔ)句,加載自己到內(nèi)存,到需要時(shí)才加載級(jí)聯(lián)對(duì)象;lazy=“false”,則會(huì)同時(shí)加載自己和級(jí)聯(lián)對(duì)象到內(nèi)存。

              e、另外還有集合的性能(set、list、map、array),都應(yīng)正確設(shè)置。

              f、正確使用第三方緩存,在讀操作頻繁寫(xiě)操作不多的情況,使用第三方緩存可大幅度提升性能,如ehcache的緩存策略有:read-only,read-write和notstrict-read-write.

              f、 隨著hibernate新版本的發(fā)布,和技術(shù)的發(fā)展,我相信hibernate的性能會(huì)越來(lái)越好,所有性能不是不使用hibernate的原因。

              4、hibernate不僅僅作為持久層的orm框架存在,它除了dao層的持久化操作外,還有很多。

              在注解annotation已經(jīng)走向主流的今天,hibernate 迅速響應(yīng),讓xml部署描述符成為可選的。Hibernate annotation 對(duì)大字段的處理只是一個(gè)@Lob就搞定了。

              hibernate search對(duì)Lucene進(jìn)行了輕量級(jí)的封裝,全文檢索變得非常簡(jiǎn)單。

              Hibernate validator被認(rèn)為是最合理的驗(yàn)證方式,將驗(yàn)證策略直接附在貫穿各層的領(lǐng)域模型domain上,不再需要哪些web框架的xml方式的驗(yàn)證,代碼中不再出現(xiàn)大量的非空/null的判斷。

              5、jbpm, Jbpm業(yè)務(wù)流程引擎的持久層采用hibenrnate來(lái)實(shí)現(xiàn),要想使用jbpm,hibernate是必須的。我想,業(yè)務(wù)流程管理無(wú)比重要,在soa迅速發(fā)展的今天,如果實(shí)施soa項(xiàng)目,業(yè)務(wù)流程管理是必然和必須的。因?yàn)閟oa就是業(yè)務(wù)和it技術(shù)的融合,是業(yè)務(wù)流程管理和it基礎(chǔ)架構(gòu)的融合。在soa中,業(yè)務(wù)管理是第一位的,這需要相應(yīng)的技術(shù)來(lái)實(shí)現(xiàn)該業(yè)務(wù)流程管理。開(kāi)源領(lǐng)域的jbpm我想會(huì)是首選。所以,為了將來(lái)有可能實(shí)施soa項(xiàng)目,為了實(shí)現(xiàn)soa的業(yè)務(wù)流程管理,應(yīng)該使用hibernate.

              6、大家都知道,hibernate將ejb2時(shí)代的實(shí)體bean趕進(jìn)了歷史,而ejb3的jpa標(biāo)準(zhǔn)也只不過(guò)是hibernate的子集而已。jsr規(guī)范請(qǐng)求的威力是巨大的,沒(méi)有各種jsr規(guī)范請(qǐng)求,就不會(huì)有各種應(yīng)用程序框架,各種應(yīng)用程序框架只是那些jsr規(guī)范請(qǐng)求的實(shí)現(xiàn)者。jpa作為持久層的規(guī)范標(biāo)準(zhǔn),引導(dǎo)持久層orm框架的方向,jpa同樣以面向?qū)ο蟮姆绞讲僮鲾?shù)據(jù)庫(kù),而不是寫(xiě)sql語(yǔ)句。規(guī)范標(biāo)準(zhǔn)都完全orm,不寫(xiě)sql了,你還有理由不跟著它嗎?

              7、Spring+hibernate+范型+可變參數(shù),這是一個(gè)非常強(qiáng)大的組合,對(duì)應(yīng)普通的crud操作,你不再需要重復(fù)寫(xiě)那些煩人的相似的dao層和manager層的代碼,僅僅需要寫(xiě)一次,就完成了所有大量的crud操作。Ibatis盡管也支持范型,但始終沒(méi)有hibernate支持的好

              8、Jboss,hibernate是jboss的項(xiàng)目,jboss的所有項(xiàng)目的持久層都采用的hibernate,要知道,jsr規(guī)范組的專(zhuān)家們大多數(shù)是來(lái)自jboss的,在一定程度上說(shuō),jboo引領(lǐng)著java的發(fā)展方向。使用hibernate,跟著jboss,不偏離java的發(fā)展方向。

              9、Gavin King,我最崇拜的偶像,他不僅發(fā)明了強(qiáng)大的hibernate,還搞出了同樣強(qiáng)大且優(yōu)雅的web2.0應(yīng)用程序框架seam.他是ejb3.0專(zhuān)家組成員之一,是jpa規(guī)范請(qǐng)求的領(lǐng)導(dǎo)者,他java領(lǐng)域最有發(fā)言權(quán)、最權(quán)威的領(lǐng)袖人物之一。現(xiàn)在,他領(lǐng)導(dǎo)web bean的,jsr299的發(fā)展,web bean規(guī)范的制定,全球軟件巨頭如ibm、oracle、bea和apache沒(méi)有一個(gè)反對(duì),紛紛響應(yīng)。Web bean,想象起來(lái),實(shí)在太美好了,完全的松耦合和強(qiáng)類(lèi)型,所有的應(yīng)用組件生活在一個(gè)應(yīng)用組件上下文context中,相互合作。那時(shí)將不再有各種各樣的上下文環(huán)境,不再有struts2的ActionContext,不再有spring的ApplicationContext,不再有hibernate的session,不再有持久化上下文,不再有事務(wù)上下文,不再有安全上下文,所有組件生活在一個(gè)大家庭中,大家其樂(lè)融融,實(shí)現(xiàn)天下的大和平。

              10、 osgi,我認(rèn)為現(xiàn)在最值得學(xué)習(xí)的一個(gè)技術(shù),有了osgi,實(shí)現(xiàn)真正的多模塊開(kāi)發(fā),改變傳統(tǒng)的開(kāi)發(fā)方式。現(xiàn)在,已經(jīng)有了hibernate osgi,spring dynamic modul(osgi),struts 2 同樣實(shí)現(xiàn)了對(duì)osgi的支持。目前,eclipse是基于osgi開(kāi)發(fā)的,ibm的websphere v6.1,bea的所有產(chǎn)品都重構(gòu)在osgi上,spring的應(yīng)用服務(wù)器同樣基于osgi,在EclipseCon2007上,osgi成為了主要的話(huà)題。Osgi受到如此的待遇,一點(diǎn)不奇怪,因?yàn)樗哂袩o(wú)比強(qiáng)大的功能,改變傳統(tǒng)的軟件開(kāi)發(fā)方式。Osgi采用樹(shù)設(shè)計(jì)模式,將一個(gè)項(xiàng)目分成多個(gè)模塊(bundle),每個(gè)模塊單獨(dú)部署,單獨(dú)運(yùn)行,說(shuō)白了,就是將一個(gè)工程分成許多的插件,每個(gè)插件單獨(dú)開(kāi)發(fā),重復(fù)使用,實(shí)現(xiàn)完全的即插即用。太令人激動(dòng)了。如果公司的軟件開(kāi)發(fā)基于osgi,將會(huì)有大量的重復(fù)使用的osgi bundles,公司將會(huì)積累大量的無(wú)形資產(chǎn),軟件開(kāi)發(fā)將會(huì)越來(lái)越快。而ibatis現(xiàn)在還沒(méi)見(jiàn)到對(duì)osgi的支持。

              11、hibernate的社區(qū)非常繁榮,ibatis則相對(duì)平靜。

              綜述,hibernate還有很多優(yōu)秀的特點(diǎn),只是我們不知道。Hibernate與ibatis,就像大家閨秀對(duì)小家碧玉,大家閨秀不僅具有小家碧玉的全部,而且知名度更高,更受尊敬,更受人追捧,更有發(fā)展前途。小家碧玉盡管也很有魅力,但始終比上大家閨秀。

              Hibernate所做的不僅僅是dao層的持久化工作,而ibatis恰恰如此。

              選擇hibernate,選擇orm的王者,選擇更全面的工作體驗(yàn),選擇更高效的工作方式,選擇更多的利潤(rùn);選擇Gavin King,跟著領(lǐng)袖走;選擇jboss,追隨開(kāi)源的潮流,不偏離java的發(fā)展方向。

              一切都不是借口。一切都在發(fā)展,hibernate會(huì)越來(lái)越好。

          posted on 2009-06-18 17:21 Werther 閱讀(5778) 評(píng)論(15)  編輯  收藏 所屬分類(lèi): 21.Hibernate

          評(píng)論:
          # re: hibernate的11大優(yōu)勢(shì) 2009-06-18 18:36 | 心夢(mèng)帆影
          想請(qǐng)教一下:
          Hibernate的多對(duì)多關(guān)聯(lián),能不能由雙方來(lái)維護(hù)這種關(guān)聯(lián)關(guān)系?  回復(fù)  更多評(píng)論
            
          # re: hibernate的11大優(yōu)勢(shì) 2009-06-18 21:33 | Always BaNg.
          Gavin King也算權(quán)威領(lǐng)袖?Hibernate說(shuō)到底還是一個(gè)應(yīng)用框架,發(fā)展的這么好的一個(gè)原因是它出來(lái)的早,用的人多了,就成為了de facto。它基本沒(méi)有啥技術(shù)含量。

            回復(fù)  更多評(píng)論
            
          # re: hibernate的11大優(yōu)勢(shì) 2009-06-18 22:14 | Artkai
          我認(rèn)為,性能的好壞無(wú)外是發(fā)送sql語(yǔ)句的多少而已。性能好,發(fā)送的sql語(yǔ)句少,性能差,就是發(fā)送大量的sql語(yǔ)句。

          無(wú)語(yǔ),看到這個(gè)后面的就不用看了。。。。  回復(fù)  更多評(píng)論
            
          # re: hibernate的11大優(yōu)勢(shì) 2009-06-19 00:56 | lg_techie
          存在必有道理!  回復(fù)  更多評(píng)論
            
          # re: hibernate的11大優(yōu)勢(shì) 2009-06-19 07:18 | ee
          @Artkai

          純支持
            回復(fù)  更多評(píng)論
            
          # re: hibernate的11大優(yōu)勢(shì) 2009-06-19 07:50 | BeanSoft
          實(shí)踐證明, Hibernate 做復(fù)雜查詢(xún)和批量處理, 實(shí)在是太差勁了! 相信用過(guò)的人會(huì)有同感. 至于性能, 的確不是只去拿 SQL 多少來(lái)比較的.  回復(fù)  更多評(píng)論
            
          # re: hibernate的11大優(yōu)勢(shì) 2009-06-19 08:48 | good
          如果要做復(fù)雜查詢(xún),直接用jdbctemplate,發(fā)送寫(xiě)好的SQL語(yǔ)句
          做批量處理,到了一定的batch size要清空session  回復(fù)  更多評(píng)論
            
          # re: hibernate的11大優(yōu)勢(shì) 2009-06-19 12:20 | 找個(gè)美女做老婆
          呵呵,你很牛啊,我都用了HIBERNATE幾年了,還沒(méi)有比了解它,慚愧,慚愧。。。

          Java樂(lè)園 技術(shù)交流社區(qū):http://www.javaly.cn
          Java樂(lè)園 群號(hào):15651281
          驗(yàn)證消息 : Java樂(lè)園  回復(fù)  更多評(píng)論
            
          # re: hibernate的11大優(yōu)勢(shì) 2009-06-19 12:21 | 找個(gè)美女做老婆
          HIBERNATE 處理 和直接用SQL語(yǔ)句比,是要差點(diǎn),但是HIBERNATE的優(yōu)點(diǎn)也應(yīng)該看到, 如果需要用SQL的時(shí)候,HIBERNATE也支持直接用SQL

          Java樂(lè)園 技術(shù)交流社區(qū):http://www.javaly.cn
          Java樂(lè)園 群號(hào):15651281
          驗(yàn)證消息 : Java樂(lè)園  回復(fù)  更多評(píng)論
            
          # re: hibernate的11大優(yōu)勢(shì) 2009-06-19 23:57 | 事發(fā)當(dāng)時(shí)
          @Always BaNg.
          Gavin King也算權(quán)威領(lǐng)袖?Hibernate說(shuō)到底還是一個(gè)應(yīng)用框架,發(fā)展的這么好的一個(gè)原因是它出來(lái)的早,用的人多了,就成為了de facto。它基本沒(méi)有啥技術(shù)含量。
          ==============================================
          哦,那找這么說(shuō)java也沒(méi)啥牛的,相對(duì)于c#,有啥技術(shù)含量,還不是因?yàn)樗鰜?lái)早!!!  回復(fù)  更多評(píng)論
            
          # re: hibernate的11大優(yōu)勢(shì) [未登錄](méi) 2009-06-22 09:40 | wzjin
          @Artkai
          -------------------------------------------------------------
          支持。
          lz沒(méi)有自己的思想,所以只能崇拜其他人。當(dāng)初使用hibernate主要是因?yàn)橐浦残院茫瑩Q數(shù)據(jù)庫(kù)只用修改配置文件。至于性能方面并不僅僅是sql語(yǔ)句發(fā)送多少的問(wèn)題。我看到許多學(xué)編程的人認(rèn)為,一步執(zhí)行的一定比兩步執(zhí)行的快,其實(shí)你不知道,你看來(lái)是一步執(zhí)行,但是封裝的內(nèi)部是多步執(zhí)行。  回復(fù)  更多評(píng)論
            
          # re: hibernate的11大優(yōu)勢(shì) [未登錄](méi) 2009-06-23 09:06 | liwei
          博主很有自己的主見(jiàn),相當(dāng)值得肯定。但有些觀點(diǎn)還是有失偏橢。無(wú)論怎樣,加油  回復(fù)  更多評(píng)論
            
          # re: hibernate的11大優(yōu)勢(shì) 2009-06-23 10:12 | 找個(gè)美女做老婆
          Java樂(lè)園交流學(xué)習(xí)社區(qū): http://www.javaly.cn

          QQ群:28840096  回復(fù)  更多評(píng)論
            
          # re: hibernate的11大優(yōu)勢(shì) 2009-06-23 10:17 | Werther
          @找個(gè)美女做老婆
          朋友,煩請(qǐng)不要多次發(fā)此類(lèi)信息.謝謝合作!
            回復(fù)  更多評(píng)論
            
          # re: hibernate的11大優(yōu)勢(shì) [未登錄](méi) 2014-11-21 14:07 | fan
          我認(rèn)為,性能的好壞無(wú)外是發(fā)送sql語(yǔ)句的多少而已。性能好,發(fā)送的sql語(yǔ)句少,性能差,就是發(fā)送大量的sql語(yǔ)句。
          群主還很年輕,慢慢學(xué)習(xí)把
            回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 含山县| 泸定县| 丰宁| 潜山县| 化德县| 台北市| 湖北省| 威宁| 启东市| 三原县| 江城| 灵璧县| 兴仁县| 绥德县| 武强县| 上犹县| 普陀区| 都昌县| 临海市| 德清县| 车险| 元江| 县级市| 宣汉县| 浦江县| 迁安市| 乐至县| 新干县| 贵南县| 万州区| 喀喇沁旗| 林西县| 汕尾市| 清徐县| 永新县| 文山县| 天祝| 讷河市| 望城县| 嘉义市| 虹口区|