hibernate总结-N+1问题
生活随笔
收集整理的這篇文章主要介紹了
hibernate总结-N+1问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ? ? ? ? ? ? 在學習過程中,經常會挺老師n+1問題,但一直對n+1迷迷糊糊的,在英語學習中,n+1是很重要的,這可以讓我們的英語越來越好,但是在hibernate中,如果遇到了n+1問題,那真的會影響性能的。
? ? ? ?一、What什么是n+1?
? ? ? ? ? ? ? ??1 )1 對多,在1 方,查找得到了n 個對象, 那么又需要將n 個對象關聯的集合取出,于是本來的一條sql查詢變成了n +1 條
? ? ? ? ? ? 2)多對1 ,在多方,查詢得到了m個對象,那么也會將m個對象對應的1 方的對象取出, 也變成了m+1
? ? ? ? ?二、How怎么解決?
? ? ? ? ? ?1 )lazy=true, hibernate3開始已經默認是lazy=true了;lazy=true時不會立刻查詢關聯對象,只有當需要關聯對象(訪問其屬性,非id字段)時才會發生查詢動作。? ? ? ? ? ? 2)二級緩存, 在對象更新,刪除,添加相對于查詢要少得多時, 二級緩存的應用將不怕n +1 問題,因為即使第一次查詢很慢,之后直接緩存命中也是很快的。
不同解決方法,不同的思路,第二條卻剛好又利用了n +1 。
? ? ? ? ? ? 3) 當然你也可以使用 fetch 抓取, Hibernate 抓取策略分為單端代理和集合代理的抓取策略。 ? ? ? ? ? ? ? ? a、單端代理的抓取策略 :
? ? ? ? ? ? ? ? ? ? ? 保持默認也就是如下 :
<many-to-one name="clazz" cascade="save-update" fetch="select" />? ? ? ? ? ? ? ? fetch="select" 就是另外發送一條 select 語句抓取當前對象關聯實體或者集合設置 fetch="join"
? ? ? ? ?<many-to-one name="clazz" cascade="save-update" fetch="join"/>? ? ? ? ? ? ? ?Hibernate 會通過 select 語句使用外連接來加載器關聯實體活集合此時 lazy 會失效
? ? ? ? ? ? ? b、集合代理的抓取策略 :
? ? ? ? ? ? ? ? ? ?保持默認( fetch="select" )也就是如下 :
<set name="students" inverse="true"><key column="clazz"/><one-to-many class="com.june.hibernate.Student"/> </set>
? ? ? ? ? ? ? ?1)fetch="select" 會另外發出一條語句查詢集合
? ? ? ? ? ? ? ?2) 設置 fetch="join" 采用外連接集合的 lazy 失效
? ? ? ? ? ? ? ?3) 這只 fetch="subselect" 另外發出一條 select 語句抓取前面查詢到的所有的實體對象的關聯集合 fetch 只對 HQL 查詢產生影響其他的則不會 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的hibernate总结-N+1问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 稼穑的读音(汉语拼音)
- 下一篇: 柏子养心丸(心脏供血不足吃柏子养心丸)