1. 程式人生 > >淺談Hibernate效能優化要點

淺談Hibernate效能優化要點

1.儘量使用many-to-one,避免使用單項one-to-many
2.靈活使用單向one-to-many
3.不用一對一,使用多對一代替一對一
4.配置物件快取,不使用集合快取
5.一對多使用Bag 多對一使用Set
6.繼承使用顯示多型 HQL:from object polymorphism="exlicit" 避免查處所有物件
7.消除大表,使用二級快取
對於上面這些,有前輩進行了詳細的講解,在此轉載,非常感謝前輩的總結。
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