Hibernate的緩衝機制介紹

來源:互聯網
上載者:User
緩衝   緩衝是介於應用程式和物理資料來源之間,其作用是為了降低應用程式對物理資料來源訪問的頻次,從而提高了應用的運行效能。緩衝內的資料是對物理資料來源中的資料的複製,應用程式在運行時從緩衝讀寫資料,在特定的時刻或事件會同步緩衝和物理資料來源的資料。

  緩衝的介質一般是記憶體,所以讀寫速度很快。但如果緩衝中存放的資料量非常大時,也會用硬碟作為緩衝介質。緩衝的實現不僅僅要考慮儲存的介質,還要考慮到管理緩衝的並發訪問和快取資料的生命週期。

  Hibernate的緩衝包括Session的緩衝和SessionFactory的緩衝,其中SessionFactory的緩衝又可以分為兩類:內建緩衝和外置緩衝。Session的緩衝是內建的,不能被卸載,也被稱為Hibernate的第一級緩衝。SessionFactory的內建緩衝和Session的緩衝在實現方式上比較相似,前者是SessionFactory對象的一些集合屬性包含的資料,後者是指Session的一些集合屬性包含的資料。SessionFactory的內建緩衝中存放了映射中繼資料和預定義SQL語句,映射中繼資料是對應檔中資料的拷貝,而預定義SQL語句是在Hibernate初始化階段根據映射中繼資料推匯出來,SessionFactory的內建緩衝是唯讀,應用程式不能修改緩衝中的映射中繼資料和預定義SQL語句,因此SessionFactory不需要進行內建緩衝與對應檔的同步。SessionFactory的外置緩衝是一個可配置的外掛程式。在預設情況下,SessionFactory不會啟用這個外掛程式。外置緩衝的資料是資料庫資料的拷貝,外置緩衝的介質可以是記憶體或者硬碟。SessionFactory的外置緩衝也被稱為Hibernate的第二級緩衝。

  Hibernate的這兩級緩衝都位於持久化層,存放的都是資料庫資料的拷貝,那麼它們之間的區別是什麼呢?為了理解二者的區別,需要深入理解持久化層的緩衝的兩個特性:緩衝的範圍和緩衝的並發存取原則。

  持久化層的緩衝的範圍

  緩衝的範圍決定了緩衝的生命週期以及可以被誰訪問。緩衝的範圍分為三類。

  1 事務範圍:緩衝只能被當前事務訪問。緩衝的生命週期依賴於事務的生命週期,當事務結束時,緩衝也就結束生命週期。在此範圍下,緩衝的介質是記憶體。事務可以是資料庫事務或者應用事務,每個事務都有獨自的緩衝,緩衝內的資料通常採用相互關聯的的對象形式。

  2 進程範圍:緩衝被進程內的所有事務共用。這些事務有可能是並發訪問緩衝,因此必須對緩衝採取必要的事務隔離機制。緩衝的生命週期依賴於進程的生命週期,進程結束時,緩衝也就結束了生命週期。進程範圍的緩衝可能會存放大量的資料,所以存放的介質可以是記憶體或硬碟。緩衝內的資料既可以是相互關聯的對象形式也可以是對象的鬆散資料形式。鬆散的對象資料形式有點類似於對象的序列化資料,但是對象分解為鬆散的演算法比對象序列化的演算法要求更快。

  3 叢集範圍:在叢集環境中,緩衝被一個機器或者多個機器的進程共用。緩衝中的資料被複製到叢集環境中的每個進程節點,進程間通過遠程通訊來保證緩衝中的資料的一致性,緩衝中的資料通常採用對象的鬆散資料形式。

  對大多數應用來說,應該謹慎地考慮是否需要使用叢集範圍的緩衝,因為訪問的速度不一定會比直接存取資料庫資料的速度快多少。

  持久化層可以提供多種範圍的緩衝。如果在事務範圍的緩衝中沒有查到相應的資料,還可以到進程範圍或叢集範圍的緩衝內查詢,如果還是沒有查到,那麼只有到資料庫中查詢。事務範圍的緩衝是持久化層的第一級緩衝,通常它是必需的;進程範圍或叢集範圍的緩衝是持久化層的第二級緩衝,通常是可選的。

  持久化層的緩衝的並發存取原則

  當多個並發的事務同時訪問持久化層的緩衝的相同資料時,會引起並發問題,必須採用必要的事務隔離措施。

  在進程範圍或叢集範圍的緩衝,即第二級緩衝,會出現並發問題。因此可以設定以下四種類型的並發存取原則,每一種策略對應一種交易隔離等級。

  事務型:僅僅在受管理環境中適用。它提供了Repeatable Read交易隔離等級。對於經常被讀但很少修改的資料,可以採用這種隔離類型,因為它可以防止髒讀和不可重複讀取這類的並發問題。

  讀寫型:提供了Read Committed交易隔離等級。僅僅在非叢集的環境中適用。對於經常被讀但很少修改的資料,可以採用這種隔離類型,因為它可以防止髒讀這類的並發問題。

  非嚴格讀寫型:不保證緩衝與資料庫中資料的一致性。如果存在兩個事務同時訪問緩衝中相同資料的可能,必須為該資料配置一個很短的資料到期時間,從而盡量避免髒讀。對於極少被修改,並且允許偶爾髒讀的資料,可以採用這種並發存取原則。   唯讀型:對於從來不會修改的資料,如參考資料,可以使用這種並發存取原則。

  事務型並發存取原則是交易隔離等級最高,唯讀型的隔離等級最低。交易隔離等級越高,並發效能就越低。

  什麼樣的資料適合存放到第二級緩衝中?

  1、很少被修改的資料

  2、不是很重要的資料,允許出現偶爾並發的資料

  3、不會被並發訪問的資料

  4、參考資料

  不適合存放到第二級緩衝的資料?

  1、經常被修改的資料

  2、財務資料,絕對不允許出現並發

  3、與其他應用共用的資料。

  Hibernate的二級緩衝

  如前所述,Hibernate提供了兩級緩衝,第一級是Session的緩衝。由於Session對象的生命週期通常對應一個資料庫事務或者一個應用事務,因此它的緩衝是事務範圍的緩衝。第一級緩衝是必需的,不允許而且事實上也無法比卸載。在第一級緩衝中,持久化類的每個執行個體都具有唯一的OID。

  第二級緩衝是一個可插拔的的快取區外掛程式,它是由SessionFactory負責管理。由於SessionFactory對象的生命週期和應用程式的整個過程對應,因此第二級緩衝是進程範圍或者叢集範圍的緩衝。這個緩衝中存放的對象的鬆散資料。第二級對象有可能出現並發問題,因此需要採用適當的並發存取原則,該策略為被緩衝的資料提供了交易隔離等級。緩衝適配器用於把具體的緩衝實現軟體與Hibernate整合。第二級緩衝是可選的,可以在每個類或每個集合的粒度上配置第二級緩衝。

  Hibernate的二級緩衝策略的一般過程如下:

  1) 條件查詢的時候,總是發出一條select * from table_name where …. (選擇所有欄位)這樣的SQL語句查詢資料庫,一次獲得所有的資料對象。

  2) 把獲得的所有資料對象根據ID放入到第二級緩衝中。

  3) 當Hibernate根據ID訪問資料對象的時候,首先從Session一級緩衝中查;查不到,如果配置了二級緩衝,那麼從二級緩衝中查;查不到,再查詢資料庫,把結果按照ID放入到緩衝。

  4) 刪除、更新、增加資料的時候,同時更新緩衝。

  Hibernate的二級緩衝策略,是針對於ID查詢的緩衝策略,對於條件查詢則毫無作用。為此,Hibernate提供了針對條件查詢的Query緩衝。

  Hibernate的Query緩衝策略的過程如下:

  1) Hibernate首先根據這些資訊組成一個Query Key,Query Key包括條件查詢的請求一般資訊:SQL, SQL需要的參數,記錄範圍(起始位置rowStart,最大記錄個數maxRows),等。

  2) Hibernate根據這個Query Key到Query緩衝中尋找對應的結果清單。如果存在,那麼返回這個結果清單;如果不存在,查詢資料庫,擷取結果清單,把整個結果清單根據Query Key放入到Query緩衝中。

  3) Query Key中的SQL涉及到一些表名,如果這些表的任何資料發生修改、刪除、增加等操作,這些相關的Query Key都要從緩衝中清空。

相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

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

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