[轉]Hibernate性能優化要點

          Robbin總結的Hibernate性能優化要點:

          1.盡量使用many-to-one,避免使用單項one-to-many
          2.靈活使用單向one-to-many
          3.不用一對一,使用多對一代替一對一
          4.配置對象緩存,不使用集合緩存
          5.一對多使用Bag 多對一使用Set
          6.繼承使用顯示多態  HQL:from object  polymorphism="exlicit" 避免查處所有對象
          7.消除大表,使用二級緩存
              對于上面這些,Robbin進行了詳細的講解。
          one-to-many
               使用inverse=false(default),對象的關聯關系是由parent對象來維護的
               而inverse=true的情況下,一般用戶雙向多對多關聯,由子對象維護關聯關系,增加子對象的時候需要顯示:child.setParent(child)
               為了提高性能,應該盡量使用雙向one-to-many inverse=true,在MVC結構中的DAO接口中應該直接用Session持久化對象,避免通過關聯關系(這句話有點不理解),而在單項關系中正確使用二級緩存,則可以大幅提高以查詢為主的應用。
               多對一性能問題比較少,但是要避免經典N+1問題。
               通過主鍵進行關聯,相當于大表拆分小表。(這個是區分面向對象設計和面向過程設計的一個關鍵點)
          list、bag、set的正確運用
               one-to-many:
               A、使用list 需要維護Index Column字段,不能被用于雙向關聯,而且必須使用inverse=false,需要謹慎使用在某些稀有場合(基本上是不予考慮使用)
               B、bag/set在one-to-many中語義基本相同,推薦使用bag
               many-to-one:
               A、bag和set不同,bag允許重復插入,建議使用set
          在龐大的集合分頁中應該使用session.createFilter
              session.createFilter(parent.getChildren(),""),setFirstResult(0),setMaxResult(10))
          避免N+1 參考(http://www.iteye.com/post/266972)
              在多對一的情況下,查詢child對象,當在頁面上顯示每個子類的父類對象的時候會導致N+1次查詢,需要采用下面的方法避免:many-to-one fetch="join|select"(該方法可能有問題)
          inverse=true 無法維護集合緩存(還不是很理解集合緩存和對象緩存)
          OLTP類型的web應用,可以群集水平擴展,不可避免的出現數據庫瓶頸
              框架能降低訪問數據庫的壓力,采用緩存是衡量一個框架是否優秀的重要標準,從緩存方面看Hibernate
              A、對象緩存,細顆粒度,是針對表的級別,透明化訪問,因為有不改變代碼的好處,所以是ORM提高性能的法寶
              B、Hibernate是目前ORM框架中緩存性能最好的框架
              C、查詢緩存
          最后Robbin還針對大家經常出現的Hibernate vs iBatis的討論進行了一個總結:
             對于OLTP應用,使用ORM框架 而OLEB應用(不確定是什么應用)最好采用JDBC或者其他方法處理
             Hibernate傾向于細顆粒度設計,面向對象,將大表拆分為多個小表,消除冗余字段,通過二級緩存提升性能。
             iBatis傾向于粗顆粒度設計,面向關系,盡量把表合并,通過Column冗余,消除關聯關系,但是iBatis沒有有效的緩存手段。

             可以說Robbin的性能總結對于使用Hibernate的開發人員有著很重要的點撥作用。非常感謝他無私奉獻自己的經驗。

          posted on 2011-06-18 12:27 ... 閱讀(667) 評論(0)  編輯  收藏 所屬分類: Struts Hibernate Spring MyBatis

          <2011年6月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          導航

          統計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          收藏夾

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 太保市| 井陉县| 水城县| 宜君县| 汶上县| 贵阳市| 常熟市| 沂水县| 华蓥市| 芷江| 博湖县| 肃南| 三都| 德清县| 青田县| 五寨县| 和林格尔县| 南部县| 五指山市| 德江县| 沂南县| 正蓝旗| 大石桥市| 红桥区| 汉源县| 广饶县| 达日县| 长乐市| 崇礼县| 德昌县| 延吉市| 临泽县| 磐石市| 南阳市| 玛曲县| 白河县| 乌拉特后旗| 郑州市| 噶尔县| 江油市| 德庆县|