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 參考(
在多對一的情況下,查詢child物件,當在頁面上顯示每個子類的父類物件的時候會導致n+1次查詢,需要採用下面的方法避免:many-to-one fetch="join|select"(該方法可能有問題)
inverse=true 無法維護集合快取(還不是很理解集合快取和物件快取)
oltp型別的web應用,可以群集水平擴充套件,不可避免的出現資料庫瓶頸
框架能降低訪問資料庫的壓力,採用快取是衡量乙個框架是否優秀的重要標準,從快取方面看hibernate
a、物件快取,細顆粒度,是針對表的級別,透明化訪問,因為有不改變**的好處,所以是orm提高效能的法寶
b、hibernate是目前orm框架中快取效能最好的框架
c、查詢快取
對於oltp應用,使用orm框架 而oleb應用(不確定是什麼應用)最好採用jdbc或者其他方法處理
hibernate傾向於細顆粒度設計,物件導向,將大表拆分為多個小表,消除冗餘字段,通過二級快取提公升效能。
ibatis傾向於粗顆粒度設計,面向關係,盡量把錶合併,通過column冗餘,消除關聯關係,但是ibatis沒有有效的快取手段。
可以說robbin的效能總結對於使用hibernate的開發人員有著很重要的點撥作用。非常感謝他無私奉獻自己的經驗。
Hibernate效能優化要點
1.盡量使用many to one,避免使用單項one to many 2.靈活使用單向one to many 3.不用一對一,使用多對一代替一對一 4.配置物件快取,不使用集合快取 5.一對多使用bag 多對一使用set 6.繼承使用顯示多型 hql from object polymorphis...
Hibernate效能優化要點
robbin總結的hibernate效能優化要點 1.盡量使用many to one,避免使用單項one to many 2.靈活使用單向one to many 3.不用一對一,使用多對一代替一對一 4.配置物件快取,不使用集合快取 5.一對多使用bag 多對一使用set 6.繼承使用顯示多型 hq...
Hibernate效能優化要點
robbin總結的hibernate效能優化要點 1.盡量使用many to one,避免使用單項one to many 2.靈活使用單向one to many 3.不用一對一,使用多對一代替一對一 4.配置物件快取,不使用集合快取 5.一對多使用bag 多對一使用set 6.繼承使用顯示多型 hq...