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

首頁 > 學院 > 開發設計 > 正文

hibernate N+1問題

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

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

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

1)一對多() ,在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+N 問題? 1 )lazy=true, hibernate3開始已經默認是lazy=true了;lazy=true時不會立刻查詢關聯對象,只有當需要關聯對象(訪問其屬性,非id字段)時才會發生查詢動作。

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.執行條件查詢時,iterate()方法具有著名的 “n+1”次查詢的問題,也就是說在第一次查詢時iterate方法會執行滿足條件的查詢結果數再加一次(n+1)的查詢。但是此問題只存在于第一次查詢時,在后面執行相同查詢時性能會得到極大的改善。此方法適合于查詢數據量較大的業務數據。

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 通州区| 永城市| 宁海县| 黄山市| 龙泉市| 新宁县| 赤峰市| 达尔| 延吉市| 汉中市| 赣榆县| 临泉县| 余干县| 和田县| 丰原市| 大荔县| 浙江省| 佛山市| 大丰市| 高雄县| 龙游县| 馆陶县| 霸州市| 星座| 烟台市| 九龙县| 定襄县| 建阳市| 崇信县| 宁化县| 安徽省| 崇礼县| 天镇县| 沂水县| 安图县| 西华县| 水富县| 洛浦县| 河北区| 古交市| 利辛县|