Hibernate性能優化要點

注:本帖轉自http://liangwang.javaeye.com/blog/117157

 

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.javaeye.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沒有有效的緩存手段。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章