Hibernate解決n+1問題


  觀點:對於n+1問題的理解。

  一般而言說n+1意思是,無論在一對多還是多對一當查詢出n條數據之后,每條數據會關聯的查詢1次他的關聯對象,這就叫做n+1。

  但是我的理解是,本來所有信息可以一次性查詢出來,也就是簡單的連表查詢,但是Hibernate會首先查詢1次得到當前對象,然后當前對象里面的n個關聯對象會再次訪問數據庫n次,這就是1+n問題。

  他們二者之間表達的意思其實是一樣的,只是描述這個問題的角度不同。不過我認為1+n更准確,因為以前我第一次看到n+1問題的時候就總是在想是不是查n然后多出一次,那其實是沒什么影響的,后來才明白。

  既然出現這個問題,肯定是要避免的,尤其是對於高並發的互聯網應用,這種現象是絕對不允許出現的。

  Hibernate給出了3中解決方案,不過我個人比較偏向於手動寫sql,也就是JDBC或者iBatis那種風格。因為這樣的sql是絕對可控的,只是在移植性方面不如Hibernate。各有所長各有所短吧。

  下面是3中解決方案:

  1.延遲加載,當需要的時候才查詢,不需要就不查詢,但是感覺這種方式治標不治本,尤其是在那種報表統計查詢的時候更為明顯。

  2.fetch="join",默認是fetch="select",這個其實說白了就是一個做外連接,允許外鍵為空的情況之下。

  3.二級緩存,第一次查詢之后存在內存中,后面的相同查詢就快了。但是有2個缺點:a.二級緩存首先是有點浪費內存空間,如果多了的話浪費還比較嚴重,這是一個不好的方面,當然這不是主要的,主要的問題在於,二級緩存的特性決定的,那就是很少的增刪改才做二級緩存,而對於普通的CRUD系統,其實不太適合。所以感覺也不是首選。

  綜合來看,用外聯結的方式比較好,Hibernate里面貌似叫什么迫切外聯結,不知道他究竟有多迫切,非得取個這樣的名字,不就是個關聯查詢嘛。

  參考:http://blog.163.com/weizonghua_2006/blog/static/13106065620124249412653/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM