亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺談Hibernate n+1問題

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

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

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

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

運行以上find()方法時,Hibernate將先查詢CUSTOMERS表中所有的記錄,然后根據(jù)每條記錄的ID,到ORDERS表中查詢有參照關(guān)系的記錄,Hibernate將依次執(zhí)行以下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對象,在內(nèi)存中形成了一幅關(guān)聯(lián)的對象圖.

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

(1) select語句的數(shù)目太多,需要頻繁的訪問數(shù)據(jù)庫,會影響檢索性能。如果需要查詢n個Customer對象,那么必須執(zhí)行n+1次select查詢語 句。這就是經(jīng)典的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)在應(yīng)用邏輯只需要訪問Customer對象,而不需要訪問Order對象的場合,加載Order對象完全是多余的操作,這些多余的Order對象白白浪費了許多內(nèi)存空間。

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

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

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

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

怎么解決n +1 問題?

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

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

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

總結(jié)

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

相關(guān)文章

  • Java基于享元模式實現(xiàn)五子棋游戲功能實例詳解

    Java基于享元模式實現(xiàn)五子棋游戲功能實例詳解

    這篇文章主要介紹了Java基于享元模式實現(xiàn)五子棋游戲功能,較為詳細的分析了享元模式的概念、功能并結(jié)合實例形式詳細分析了Java使用享元模式實現(xiàn)五子棋游戲的具體操作步驟與相關(guān)注意事項,需要的朋友可以參考下
    2018-05-05
  • java分布式面試接口如何保證冪等及概念理解

    java分布式面試接口如何保證冪等及概念理解

    這篇文章主要為大家介紹了java分布式面試中接口如何保證冪等的問題解答以及概念描述,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-03-03
  • 簡單了解springboot加載配置文件順序

    簡單了解springboot加載配置文件順序

    這篇文章主要介紹了簡單了解springboot加載配置文件順序,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • Java Clone(類的復(fù)制)實例代碼

    Java Clone(類的復(fù)制)實例代碼

    Java Clone(類的復(fù)制)實例代碼,需要的朋友可以參考一下
    2013-03-03
  • Java基礎(chǔ)之代碼死循環(huán)詳解

    Java基礎(chǔ)之代碼死循環(huán)詳解

    這篇文章主要介紹了Java基礎(chǔ)之代碼死循環(huán)詳解,文中有非常詳細的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • springboot X-Accel-Redirect 大文件下載實現(xiàn)

    springboot X-Accel-Redirect 大文件下載實現(xiàn)

    本文主要介紹了springboot X-Accel-Redirect 大文件下載實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 基于Spring AOP @AspectJ進階說明

    基于Spring AOP @AspectJ進階說明

    這篇文章主要介紹了基于Spring AOP @AspectJ進階說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • CentOS7和8中安裝Maven3.8.4的簡單步驟

    CentOS7和8中安裝Maven3.8.4的簡單步驟

    maven是屬于apache的一個工具,主要是對java進行編譯打包,解決依賴關(guān)系,下面這篇文章主要給大家介紹了關(guān)于CentOS7和8中安裝Maven3.8.4的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • Java使用訪問者模式解決公司層級結(jié)構(gòu)圖問題詳解

    Java使用訪問者模式解決公司層級結(jié)構(gòu)圖問題詳解

    這篇文章主要介紹了Java使用訪問者模式解決公司層級結(jié)構(gòu)圖問題,結(jié)合實例形式分析了訪問者模式的概念、原理及Java使用訪問者模式解決公司曾經(jīng)結(jié)構(gòu)圖問題的相關(guān)操作技巧與注意事項,需要的朋友可以參考下
    2018-04-04
  • spring中使用mybatis實現(xiàn)批量插入的示例代碼

    spring中使用mybatis實現(xiàn)批量插入的示例代碼

    這篇文章主要介紹了spring中使用mybatis實現(xiàn)批量插入的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06

最新評論