国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

hibernate N+1問題

2019-11-14 10:13:40
字體:
來源:轉載
供稿:網友

什么時候會遇到1+N的問題?

前提:hibernate默認表與表的關聯方法是fetch=”select”,不是fetch=”join”,這都是為了懶加載而準備的。

1)一對多() ,在1的這方,通過1條sql查找得到了1個對象,由于關聯的存在 ,那么又需要將這個對象關聯的集合取出,所以合集數量是n還要發(fā)出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+N 問題? 1 )lazy=true, hibernate3開始已經默認是lazy=true了;lazy=true時不會立刻查詢關聯對象,只有當需要關聯對象(訪問其屬性,非id字段)時才會發(fā)生查詢動作。

2)使用二級緩存, 二級緩存的應用將不怕1+N 問題,因為即使第一次查詢很慢(未命中),以后查詢直接緩存命中也是很快的。剛好又利用了1+N 。

3) 當然你也可以設定fetch=”join”,一次關聯表全查出來,但失去了懶加載的特性。

//join fetch @Test public void test1_N3(){ session session=sf.getCurrentSession(); session.beginTransaction(); //List<Topic> topics=(List<Topic>)session.createCriteria(Topic.class).list(); List<Topic> topics=(List<Topic>)session.createQuery("from Topic t left join fetch t.category c").list(); for (Topic t:topics) { System.out.執(zhí)行條件查詢時,iterate()方法具有著名的 “n+1”次查詢的問題,也就是說在第一次查詢時iterate方法會執(zhí)行滿足條件的查詢結果數再加一次(n+1)的查詢。但是此問題只存在于第一次查詢時,在后面執(zhí)行相同查詢時性能會得到極大的改善。此方法適合于查詢數據量較大的業(yè)務數據。

但是注意:當數據量特別大時(比如流水線數據等)需要針對此持久化對象配置其具體的緩存策略,比如設置其存在于緩存中的最大記錄數、緩存存在的時間等參數,以避免系統(tǒng)將大量的數據同時裝載入內存中引起內存資源的迅速耗盡,反而降低系統(tǒng)的性能?。?!


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 西城区| SHOW| 来凤县| 厦门市| 高清| 伊通| 女性| 吴江市| 壶关县| 高青县| 乌兰浩特市| 龙口市| 新密市| 马山县| 滦南县| 荆门市| 洛南县| 北辰区| 乌拉特后旗| 乌审旗| 深州市| 嘉兴市| 东乡族自治县| 通榆县| 德昌县| 巴里| 岳池县| 图片| 宁陕县| 明水县| 东平县| 东阿县| 万年县| 都江堰市| 黑龙江省| 汝城县| 抚顺市| 远安县| 通渭县| 宁晋县| 鲜城|