【Java基礎】Hibernate的緩衝機制以及消極式載入

來源:互聯網
上載者:User

標籤:hibernate   ssh   

    上篇部落格介紹了Hibernate的基本原理,在部落格尾聲的時候提到了Hibernate的緩衝機制以及消極式載入問題,這篇部落格我們繼續,將這兩部分的內容補充完。


    首先說說Hibernate的緩衝機制,我們都知道Hiernate有一級緩衝、二級緩衝,但是具體的機制原理瞭解的清楚嗎?這裡我們就來好好說說Hibernate的緩衝機制。先說說為什麼要用緩衝機制?Hibernate是一個持久層架構,經常訪問物理資料庫,為了降低應用程式對資料來源訪問的頻次,從而提高應用程度的運行效能。緩衝內的資料是對物理資料來源中的資料的複製,應用程式在運行時從緩衝中讀寫資料,在特定時間或事件中的會同步緩衝和物理資料來源的資料。


    介紹完Hibernate緩衝的作用,下面說說Hibernate緩衝的分類了其實我們上面都說了,Hibernate緩衝分為一級緩衝和二級緩衝。Hibernate的一級緩衝 又稱為“Session的緩衝”,它是內建的,不能被卸載,這裡面的不能卸載的意識是這種緩衝不具有可選性,是必須有的功能,是不能被取消的。由於Session對象的生命週期通常對應一個資料庫事務或者一個應用事務,因此它的緩衝是事務範圍內的緩衝。一級緩衝是必須的,不允許而且事實上也無法卸載。在一級緩衝中,持久化類的每一個執行個體都具有唯一的OID。下面說二級緩衝,Hibernate的二級緩衝又稱為“SessionFactory的緩衝”,由於SessionFactory對象的生命週期和應用程式的整個過程對應,因此Hibernate的二級緩衝是進程範圍或者叢集範圍的緩衝。有可能出現並發問題,因此需要採用適當的並發存取原則,該策略為被緩衝的資料提供了交易隔離等級,二級緩衝是可選的,相對於一級緩衝而言它是一個可配置的外掛程式,在預設情況下,SessionFactory不會啟用這個外掛程式。


    那麼什麼樣的資料適合存在二級緩衝中呢?第一、很少被修改的資料;第二、不是很重要的資料,允許出現偶爾並發的資料;第三、不會被並發訪問的資料;第四、常量的資料。那麼相對而言什麼樣的資料不適合存放在二級緩衝中呢?第一、經常被修改的資料;第二、絕對不允許出現並發訪問的資料,如財務資料;第三、與其他應用程式共用的資料。


    那麼具體是如何應用緩衝機制的呢?我們來舉個例子,比如說當Hibernate根據ID訪問資料對象的時候,它會首先從Session一級緩衝中去查,如果查不到,如果配置了二級緩衝,就去二級緩衝中去查;如果還查不到,那麼就去資料庫中查,把結果按照ID放入到緩衝中。刪除、更新、增加資料的時候,同時更新緩衝。


    好了,Hibernate的緩衝機制就介紹了到這裡,下面我們說說Hibernate的消極式載入。Hibernate的消極式載入是非常常用的技術。先說消極式載入的概念,消極式載入時只有真正使用該對象時才會建立,對於Hibernate而言,它是支援消極式載入的,也稱為懶載入,是在真正使用對象的時候才會發送sql語句,查詢對象的時候不會發送sql語句。Hibernate通過這種消極式載入開降低系統的記憶體開銷,從而保證Hibernate的運行效能。


    Hibernate主要聽過代理Proxy機制來實現消極式載入,具體的過程是Hibernate從資料庫中擷取某一個對象資料或某一個對象的集合屬性值或擷取某一個對象所關聯的另一個對象時,由於沒有使用該對象的資料,Hibernate並不是從資料庫載入真正的資料,而只是為該對象建立一個代理對象來代表這個對象,這個對象上的所有屬性都是預設值。只有在真正需要使用該對象的資料時才建立這個真實對象,真正從資料庫中載入它的資料,這樣在某些情況下,可以提高查詢效率。


    get方法不支援消極式載入,get方法在查詢不到對象時不會出現異常。與之對應的load方法支援消極式載入,load在查詢不到對象時會拋出異常。舉個例子說明一下,現在我們都知道了Hibernate的消極式載入會降低系統的記憶體開銷,在某些程度上卻是會給程式的查詢效率帶來好處,但有時候明確知道資料需要立刻被載入,如果Hibernate先預設使用消極式載入,隨後又必須去資料庫載入,反而會降低效率。這個時候怎麼辦?記住上面說的,get方法是不支援消極式載入的,如果在載入單個實體時,如果不需要消極式載入,就可以使用session的get()方法。提到session又想到了,Hibernate支援消極式載入必須在session開啟的情況下才有效。


    對Hibernate的消極式載入的基本介紹先到這裡,研究的還不是特別深入,在以後的應用中會慢慢更新這方面的文章。個人覺得緩衝機制和消極式載入是Hibernate中比較重要的知識點,需要很好的掌握。其實深挖東西是挺多的,歡迎大家提寶貴意見,歡迎留言我們一起溝通交流。

【Java基礎】Hibernate的緩衝機制以及消極式載入

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.