1,什麼是n+1次查詢
在使用hibernate,或者ibatis等工具查詢資料庫的時候,由於快取,或者lazyload(懶載入)等原因,可能會造成要查詢n個結果,但是不得不執行n+1次查詢資料庫操作,造成效率低下。
2,使用hibernate,什麼時候會產生n+1次查詢
a,使用iterate查詢的時候
例如:query q=session.createquery("from user");
list l=q.iterator();//此時執行了一條sql語句select user_id from user,只把user的id值取了 出來
iteratorit=l.iterator();
while(it.hasnext()){
system.out.println(it.next());//當真正要取得結果的時候,hibernate會根據id值逐條的按照順序查
//找,先到一級快取中查詢,再到二級快取中查詢,最後到資料庫中查 //找,如果快取沒有命中的話,就會產生n+1次查詢。
b,在使用查詢子物件的時候,比如:先查詢某個人的身份證,「from idcard where card.id="111"」;得到該idcard物件後,如果要要得到person,使用idcard.getperson方法,此時會再次查詢資料庫。造成n+1此查詢,這是由於懶載入造成的。hibernate預設情況下懶載入是開的,也就是說如果附屬物件被載入的話,主物件不會主動被載入。
c,查詢快取開啟,但是時間設定不合理。
避免方法:
1,合理的利用二級快取
2,設定懶載入的時候,注意方法
n 1次select查詢問題
什麼叫n 1次select查詢問題?在session的快取中存放的是相互關聯的物件圖。預設情況下,當hibernate從資料庫中載入customer物件時,會同時載入所有關聯的order物件。以customer和order類為例,假定orders表的customer id外來鍵允許為null,圖1列...
JPA 解決n 1次查詢問題
分兩步操作 1 主表實體類中,新增註解 namedentitygraph 如上,設定name值,並指定attributenodes 看名字就知道可以指定多個 每個node的值如下圖紅框 2 在主表的dao方法中 重寫用到的查詢方法,service層中呼叫什麼方法就重寫什麼方法,我這邊用到的是 pag...
什麼叫n 1次select查詢問題
在session的快取中存放的是相互關聯的物件圖。預設情況下,當hibernate從資料庫中載入customer物件時,會同時載入所有關聯的order物件。以customer和order類為例,假定orders表的customer id外來鍵允許為null,圖1列出了customers表和order...