最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Hibernate n+1問(wèn)題

 更新時(shí)間:2018年02月12日 11:15:59   作者:隨緣121  
這篇文章主要介紹了淺談Hibernate n+1問(wèn)題,怎么解決n+1問(wèn)題,文中也作了簡(jiǎn)要分析,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下

在Session的緩存中存放的是相互關(guān)聯(lián)的對(duì)象圖。默認(rèn)情況下,當(dāng)Hibernate從數(shù)據(jù)庫(kù)中加載Customer對(duì)象時(shí),會(huì)同時(shí)加載所有關(guān)聯(lián)的 Order對(duì)象。以Customer和Order類為例,假定ORDERS表的CUSTOMER_ID外鍵允許為null

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

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

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

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;

通過(guò)以上5條select語(yǔ)句,Hibernate最后加載了4個(gè)Customer對(duì)象和5個(gè)Order對(duì)象,在內(nèi)存中形成了一幅關(guān)聯(lián)的對(duì)象圖.

Hibernate在檢索與Customer關(guān)聯(lián)的Order對(duì)象時(shí),使用了默認(rèn)的立即檢索策略。這種檢索策略存在兩大不足:

(1) select語(yǔ)句的數(shù)目太多,需要頻繁的訪問(wèn)數(shù)據(jù)庫(kù),會(huì)影響檢索性能。如果需要查詢n個(gè)Customer對(duì)象,那么必須執(zhí)行n+1次select查詢語(yǔ) 句。這就是經(jīng)典的n+1次select查詢問(wèn)題。這種檢索策略沒(méi)有利用SQL的連接查詢功能,例如以上5條select語(yǔ)句完全可以通過(guò)以下1條 select語(yǔ)句來(lái)完成:

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

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

(2)在應(yīng)用邏輯只需要訪問(wèn)Customer對(duì)象,而不需要訪問(wèn)Order對(duì)象的場(chǎng)合,加載Order對(duì)象完全是多余的操作,這些多余的Order對(duì)象白白浪費(fèi)了許多內(nèi)存空間。

為了解決以上問(wèn)題,Hibernate提供了其他兩種檢索策略:延遲檢索策略和迫切左外連接檢索策略。延遲檢索策略能避免多余加載應(yīng)用程序不需要訪問(wèn)的關(guān)聯(lián)對(duì)象,迫切左外連接檢索策略則充分利用了SQL的外連接查詢功能,能夠減少select語(yǔ)句的數(shù)目。

對(duì)數(shù)據(jù)庫(kù)訪問(wèn)還是必須考慮性能問(wèn)題的, 在設(shè)定了1 對(duì)多這種關(guān)系之后, 查詢就會(huì)出現(xiàn)傳說(shuō)中的n +1 問(wèn)題。

1 )1 對(duì)多,在1 方,查找得到了n 個(gè)對(duì)象, 那么又需要將n 個(gè)對(duì)象關(guān)聯(lián)的集合取出,于是本來(lái)的一條sql查詢變成了n +1 條

2)多對(duì)1 ,在多方,查詢得到了m個(gè)對(duì)象,那么也會(huì)將m個(gè)對(duì)象對(duì)應(yīng)的1 方的對(duì)象取出, 也變成了m+1

怎么解決n +1 問(wèn)題?

1 )lazy=true, hibernate3開(kāi)始已經(jīng)默認(rèn)是lazy=true了;lazy=true時(shí)不會(huì)立刻查詢關(guān)聯(lián)對(duì)象,只有當(dāng)需要關(guān)聯(lián)對(duì)象(訪問(wèn)其屬性,非id字段)時(shí)才會(huì)發(fā)生查詢動(dòng)作。

2)二級(jí)緩存, 在對(duì)象更新,刪除,添加相對(duì)于查詢要少得多時(shí), 二級(jí)緩存的應(yīng)用將不怕n +1 問(wèn)題,因?yàn)榧词沟谝淮尾樵兒苈?,之后直接緩存命中也是很快的?
不同解決方法,不同的思路,第二條卻剛好又利用了n +1 。

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

總結(jié)

以上就是本文關(guān)于淺談Hibernate n+1問(wèn)題的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!

相關(guān)文章

  • Freemarker 最簡(jiǎn)單的例子程序

    Freemarker 最簡(jiǎn)單的例子程序

    Freemarker最簡(jiǎn)單的例子程序是通過(guò)String來(lái)創(chuàng)建模版對(duì)象,并執(zhí)行插值處理。
    2016-04-04
  • 詳談Spring是否支持對(duì)靜態(tài)方法進(jìn)行Aop增強(qiáng)

    詳談Spring是否支持對(duì)靜態(tài)方法進(jìn)行Aop增強(qiáng)

    這篇文章主要介紹了Spring是否支持對(duì)靜態(tài)方法進(jìn)行Aop增強(qiáng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 淺析Mysql中的視圖

    淺析Mysql中的視圖

    這篇文章主要介紹了淺析Mysql中的視圖,視圖是從一個(gè)或者多個(gè)表中導(dǎo)出的表,視圖的行為與表非常相似,在視圖中用戶可以使用SELECT語(yǔ)句查詢數(shù)據(jù),以及使用INSERT、UPDATE和DELETE修改記錄,需要的朋友可以參考下
    2023-05-05
  • Java操作SSH2實(shí)現(xiàn)遠(yuǎn)程執(zhí)行l(wèi)inux命令

    Java操作SSH2實(shí)現(xiàn)遠(yuǎn)程執(zhí)行l(wèi)inux命令

    這篇文章主要為大家詳細(xì)介紹了Java如何操作SSH2實(shí)現(xiàn)遠(yuǎn)程執(zhí)行l(wèi)inux命令,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-01-01
  • java實(shí)現(xiàn)五子棋小游戲

    java實(shí)現(xiàn)五子棋小游戲

    這篇文章主要介紹了java實(shí)現(xiàn)五子棋小游戲的相關(guān)資料,十分簡(jiǎn)單實(shí)用,推薦給大家,需要的朋友可以參考下
    2015-03-03
  • SpringBoot創(chuàng)建定時(shí)任務(wù)的示例詳解

    SpringBoot創(chuàng)建定時(shí)任務(wù)的示例詳解

    在Spring Boot中創(chuàng)建定時(shí)任務(wù),通常使用@Scheduled注解,這是Spring框架提供的一個(gè)功能,允許你按照固定的頻率(如每天、每小時(shí)、每分鐘等)執(zhí)行某個(gè)方法,本文給大家介紹了SpringBoot創(chuàng)建定時(shí)任務(wù)的示例,需要的朋友可以參考下
    2024-04-04
  • Java元組類型javatuples使用實(shí)例

    Java元組類型javatuples使用實(shí)例

    這篇文章主要介紹了Java元組類型javatuples使用實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Spring Boot使用RestTemplate消費(fèi)REST服務(wù)的幾個(gè)問(wèn)題記錄

    Spring Boot使用RestTemplate消費(fèi)REST服務(wù)的幾個(gè)問(wèn)題記錄

    這篇文章主要介紹了Spring Boot使用RestTemplate消費(fèi)REST服務(wù)的幾個(gè)問(wèn)題記錄,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • Java實(shí)現(xiàn)遠(yuǎn)程控制技術(shù)完整源代碼分享

    Java實(shí)現(xiàn)遠(yuǎn)程控制技術(shù)完整源代碼分享

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)遠(yuǎn)程控制技術(shù)完整源代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Java File類常用方法與文件過(guò)濾器詳解

    Java File類常用方法與文件過(guò)濾器詳解

    Java File類以抽象的方式代表文件名和目錄路徑名。該類主要用于文件和目錄的創(chuàng)建、文件的查找和文件的刪除等。File對(duì)象代表磁盤中實(shí)際存在的文件和目錄。本篇文章我們來(lái)講解File類的常用方法與文件過(guò)濾器
    2022-04-04

最新評(píng)論

海兴县| 武清区| 信阳市| 长治市| 章丘市| 荆州市| 海口市| 荣昌县| 昆明市| 巴中市| 治县。| 汝南县| 巩义市| 庆云县| 铁力市| 宜城市| 阜阳市| 辽中县| 西青区| 宣威市| 北海市| 义乌市| 芷江| 巴楚县| 大渡口区| 合作市| 乐山市| 汉寿县| 隆林| 甘孜县| 友谊县| 建平县| 西乌| 长岛县| 碌曲县| 石狮市| 大同市| 来凤县| 正安县| 巴马| 兰溪市|