關於N 1次查詢

2021-04-26 11:42:17 字數 839 閱讀 1838

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...