懶加載可以提高性能嗎?
不可以簡單的說"能",因為Hibernate的關(guān)系映射拖累了SQL的性能,所以想出懶加載來彌補.只是彌補而以,不會超越.所以大家不要想著使用了懶加載總體性能就提高了,其實總體性能不下降就萬幸了.
----------------------------------------------------------
Hibernate的lazy屬性可以配置在:
(常用)標(biāo)簽上,可以取值true,false,extra
默認(rèn)為true,當(dāng)為true時,會懶加載,訪問集合屬性時再發(fā)出SQL語句.但set.size()時,很不智能,不會生成count()語句,而是查出所有記錄賦值給set.
extra說明:調(diào)用集合的set.size()時,會生成select count(*)from tableName,比較智能.建議使用
(少用)標(biāo)簽上,可以取值false,proxy,noproxy
當(dāng)為true時,會有懶加載特性,當(dāng)為false時會產(chǎn)生N+1問題,比如一個學(xué)生對應(yīng)一個班級,用一條SQL查出10個學(xué)生,當(dāng)訪問學(xué)生的班級屬性時Hibernate會再產(chǎn)生10條SQL分別查出每個學(xué)生對應(yīng)的班級.
(不用)標(biāo)簽上,可以取值true,false
默認(rèn)為true,當(dāng)為false時,load()方法將失去懶加載的特性與get()一樣,不影響集合()標(biāo)簽上的lazy特性
(不用)標(biāo)簽上,可以取值true,false
默認(rèn)值為false,懶加載某個字段,無意義,不要使用
----------------------------------------------------------
get()與load()的區(qū)別
get()無懶加載特性,馬上執(zhí)行SQL查詢.
load()有懶加載特性,會返加一個代理對象,所以永遠(yuǎn)不為null,先不執(zhí)行SQL,要取對象的值時才執(zhí)行SQL語句,前題session不能關(guān)閉,標(biāo)簽上lazy不為false.
----------------------------------------------------------
實現(xiàn)懶加載的前提:1 PO不能是final的
2 能實現(xiàn)懶加載的對象(PO)都是被CGLIB改寫的代理對象,所以不能是final修飾的
3 須要asm,cglib兩個jar包
4 相應(yīng)的lazy屬性為true
5 相應(yīng)的fetch屬性為select
----------------------------------------------------------
什么時候出遇到懶加載
1 使用load()
2 一對一
查主對象默認(rèn)使用join連接,不會發(fā)生懶加載
查從對象默認(rèn)會發(fā)生懶加載,先執(zhí)行一句select查出從對象,當(dāng)通過從對象訪問了主對象時,再執(zhí)行一句select查出主對象.
3 多對一
在使用hbm.xnl時吏砂,取多的一方時,默認(rèn)會懶加載蜂大,不取一的一方
在使用JPA時,取多的一方時盆耽,默認(rèn)自動使用join on語句取出一的一方(用戶與組智蝠,用戶是多的一方票摇,組是一的一方)
4 一對多()
默認(rèn)會懶加載,這是必須的,是重常用的斧抱。
----------------------------------------------------------
實現(xiàn)懶加載的方案:
方法一:(沒有使用懶加載)
用 Hibernate.initialize(de.getEmps()) 提前加載一下.
方法二:
把與Session脫離的對象重新綁定
lock()方法是用來讓應(yīng)用程序把一個未修改的對象重新關(guān)聯(lián)到新session的方法常拓。
Java代碼
//直接重新關(guān)聯(lián)
session.lock(fritz, LockMode.NONE);
//進(jìn)行版本檢查后關(guān)聯(lián)
session.lock(izi, LockMode.READ);
//使用SELECT ... FOR UPDATE進(jìn)行版本檢查后關(guān)聯(lián)
session.lock(pk, LockMode.UPGRADE);
方法三:
OpenSessionInView
【科多大數(shù)據(jù)下次為你介紹】
http://www.101test.com/cand/index?paperId=IPBAKU