<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-59  評論-31  文章-0  trackbacks-0

    在Session的緩存中存放的是相互關聯的對象圖。默認情況下,當Hibernate從數據庫中加載Customer對象時,會同時加載所有關聯的 Order對象。以Customer和Order類為例,假定ORDERS表的CUSTOMER_ID外鍵允許為null

    以下Session的find()方法用于到數據庫中檢索所有的Customer對象: 

    List customerLists=session.find("from Customer as c"); 

    運行以上find()方法時,Hibernate將先查詢CUSTOMERS表中所有的記錄,然后根據每條記錄的ID,到ORDERS表中查詢有參照關系的記錄,Hibernate將依次執行以下select語句: 

    select * from CUSTOMERS; 
    select * from ORDERS where CUSTOMER_ID=1; 
    select * from ORDERS where CUSTOMER_ID=2; 
    select * from ORDERS where CUSTOMER_ID=3; 
    select * from ORDERS where CUSTOMER_ID=4; 

    通過以上5條select語句,Hibernate最后加載了4個Customer對象和5個Order對象,在內存中形成了一幅關聯的對象圖.


    Hibernate在檢索與Customer關聯的Order對象時,使用了默認的立即檢索策略。這種檢索策略存在兩大不足: 

    (1) select語句的數目太多,需要頻繁的訪問數據庫,會影響檢索性能。如果需要查詢n個Customer對象,那么必須執行n+1次select查詢語 句。這就是經典的n+1次select查詢問題。這種檢索策略沒有利用SQL的連接查詢功能,例如以上5條select語句完全可以通過以下1條 select語句來完成: 

    select * from CUSTOMERS left outer join ORDERS 
    on CUSTOMERS.ID=ORDERS.CUSTOMER_ID 

    以上select語句使用了SQL的左外連接查詢功能,能夠在一條select語句中查詢出CUSTOMERS表的所有記錄,以及匹配的ORDERS表的記錄。 

    (2)在應用邏輯只需要訪問Customer對象,而不需要訪問Order對象的場合,加載Order對象完全是多余的操作,這些多余的Order對象白白浪費了許多內存空間。 
    為了解決以上問題,Hibernate提供了其他兩種檢索策略:延遲檢索策略和迫切左外連接檢索策略。延遲檢索策略能避免多余加載應用程序不需要訪問的關聯對象,迫切左外連接檢索策略則充分利用了SQL的外連接查詢功能,能夠減少select語句的數目。


    對數據庫訪問還是必須考慮性能問題的, 在設定了1 對多這種關系之后, 查詢就會出現傳說中的n +1 問題。 
    1 )1 對多,在1 方,查找得到了n 個對象, 那么又需要將n 個對象關聯的集合取出,于是本來的一條sql查詢變成了n +1 條 
    2)多對1 ,在多方,查詢得到了m個對象,那么也會將m個對象對應的1 方的對象取出, 也變成了m+1

    怎么解決n +1 問題? 
    1 )lazy=true, hibernate3開始已經默認是lazy=true了;lazy=true時不會立刻查詢關聯對象,只有當需要關聯對象(訪問其屬性,非id字段)時才會發生查詢動作。 

    2)二級緩存, 在對象更新,刪除,添加相對于查詢要少得多時, 二級緩存的應用將不怕n +1 問題,因為即使第一次查詢很慢,之后直接緩存命中也是很快的。 
    不同解決方法,不同的思路,第二條卻剛好又利用了n +1 。

    3) 當然你也可以設定fetch=join(annotation : @ManyToOne() @Fetch(FetchMode.JOIN))

    posted on 2012-01-30 14:20 RoyPayne 閱讀(10907) 評論(1)  編輯  收藏 所屬分類: SSH

    評論:
    # re: Hibernate n+1問題 2012-12-25 18:11 | qinxike
    現在問題是加了fetch會報錯!除了fetch,沒有其他辦法了嗎?  回復  更多評論
      
    主站蜘蛛池模板: 四虎永久免费影院在线| 亚洲国产成人久久精品大牛影视| 国产免费看插插插视频| 99精品视频在线免费观看| 免费一级全黄少妇性色生活片| 亚洲av无码久久忘忧草| 亚洲AV成人精品网站在线播放| 伊在人亚洲香蕉精品区麻豆| 日韩免费一区二区三区在线播放| 久久久久免费视频| 免费手机在线看片| 色五月五月丁香亚洲综合网| 亚洲av无码一区二区三区观看| 国产精品亚洲综合天堂夜夜| 91亚洲va在线天线va天堂va国产| 亚洲中文字幕无码中文字在线| 免费一级做a爰片久久毛片潮喷| 成人毛片18女人毛片免费| 69成人免费视频| 无码国产精品一区二区免费式直播 | 亚洲午夜一区二区三区| 亚洲第一区视频在线观看| 亚洲成人午夜在线| 久久亚洲精品中文字幕无码| 亚洲午夜福利在线观看| 国产亚洲av人片在线观看| 亚洲日本中文字幕一区二区三区| 免费一级毛片在级播放| 国产成人免费一区二区三区| 免费黄色网址入口| 日韩伦理片电影在线免费观看| 成人性生交大片免费看午夜a| 成年女人喷潮毛片免费播放| 毛片免费vip会员在线看| 好男人视频社区精品免费| 最近2019中文免费字幕| 成人免费在线观看网站| 青青草国产免费久久久91| 色吊丝永久在线观看最新免费| 日韩一级视频免费观看| 又粗又黄又猛又爽大片免费|