問題】
什麼時候會遇到n+1的問題?
【備註】
hibernate預設抓取策略是fetch="select",不是fetch="join",這都是為了延遲載入而準備的。
【出現情況】
1)一對多(one-to-many) ,在1的這方,通過1條sql查詢得到了1個物件,由於關聯的存在 ,那麼又需要將這個物件關聯的集合取出,所以合集數量是n還要發出n條sql,於是本來的1條sql查詢變成了 1 +n條 。
2)多對一,在多的這方,通過1條sql查詢得到了n個物件,由於關聯的存在,也會將這n個物件對應的1 方的物件取出, 於是本來的1條sql查詢變成了1 +n條 。
3)iterator 查詢時,一定先去快取中找(1條sql查集合,只查出id),在沒命中時,會再按id到庫中逐一查詢, 產生1+n條sql。
【解決辦法】
1)lazy=true, hibernate3開始已經預設是lazy=true了;lazy=true時不會立刻查詢關聯物件,只有當需要關聯物件(訪問其屬性,非id欄位)時才會發生查詢動作。
2)使用二級快取, 二級快取的應用將不怕1+n 問題,因為即使第一次查詢很慢(未命中),以後查詢直接快取命中也是很快的。剛好又利用了1+n 。
3 ) 當然你也可以設定fetch="join",一次關聯表全查出來,但失去了延遲載入的特性。
Hibernate N 1 問題及解決辦法
hibernate n 1 問題及解決辦法 問題出現的原因 hibernate 中常會用到 set bag 等集合表示 1 對多的關係,在獲取實體的時候就能根據關係將關聯的物件或者物件集取出,還可以設定 cacade 進行關聯更新和刪除。這不得不說 hibernate 的 orm 做得很好,很貼近 ...
如何解決併發
雖然從巨集觀上,處理器是並行處理多項任務,但本質上乙個處理器在某個時間點只能處理乙個任務,屬於序列執行。在單處理器的情況下,併發問題源於多道程式設計系統的乙個基本特性 程序的相對執行速度不可 它取決於其他程序的活動 作業系統處理中斷的方式以及作業系統的排程策略。在分布式環境下,併發產生的可能性就更大...
如何解決查詢N 1問題
1.使用資料庫left join來實現,在一次資料庫查詢中查出多條資料,但是要對結果進行分組組裝。但是對於分頁支援不好,需要自定義分頁外掛程式,現有解決思路如下 編寫sql時,將主表的條件寫入到where條件中,將所有left join的條件寫到on中,使用and來拼接多個條件,然後編寫分頁外掛程式...