1. 程式人生 > >客觀面試題--30.hibernate的一級快取和二級快取有什麼區別?

客觀面試題--30.hibernate的一級快取和二級快取有什麼區別?

快取是介於應用程式和物理資料來源之間,其作用是為了降低應用程式對物理資料來源訪問的頻次,從而提高了應用的執行效能。快取內的資料是對物理資料來源中的資料的複製,應用程式在執行時從快取讀寫資料,在特定的時刻或事件會同步快取和物理資料來源的資料。

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

  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都要從快取中清空。

相關推薦

客觀試題--30.hibernate一級快取二級快取什麼區別

快取是介於應用程式和物理資料來源之間,其作用是為了降低應用程式對物理資料來源訪問的頻次,從而提高了應用的執行效能。快取內的資料是對物理資料來源中的資料的複製,應用程式在執行時從快取讀寫資料,在特定的時刻或事件會同步快取和物理資料來源的資料。  快取的介質一般是記憶體,所以讀寫

Hibernate總結--一級快取二級快取

在Hibernate中存在一級快取和二級快取,一級快取時Session 級別的快取,它是屬於事務範圍的快取,這一級別的快取由 hibernate 管理的。一級快取Hibernate預設會實現,當使用get或者load等方式查詢時會將結果存在Session中,在下一次查詢時。若是同一個Session,

Hibernate一級快取二級快取

1:Hibernate的一級快取:   1.1:使用一級快取的目的是為了減少對資料庫的訪問次數,從而提升hibernate的執行效率;(當執行一次查詢操作的時候,執行第二次查詢操作,先檢查快取中是否有資料,如果有資料就不查詢資料庫,直接從快取中獲取資料);    1.

hibernate快取一級快取二級快取理解

一、什麼是快取:   快取是指為了降低應用程式對物理資料來源訪問的頻次從而提高應用程式的執行效能的一種策略。 二、為什麼使用快取: 1.ORM框架訪問資料庫的效率直接影響應用程式的執行速度,提升和優化ORM框架的執行效率至關重要。 2.Hibernate的快取是提升和

hibernate一級快取二級快取區別

                       快取是介於應用程式和物理資料來源之間,其作用是為了降低應用程式對物理資料來源訪問的頻次,從而提高了應用的執行效能。快取內的資料是對物理資料來源中的資料的複製,應用程式在執行時從快取讀寫資料,在特定的時刻或事件會同步快取和物理資料來源的資料。   快取的介質一般是記

java Hibernate一級快取二級快取概念案例詳解

  一、一級快取二級快取的概念解釋   (1)一級快取就是Session級別的快取,一個Session做了一個查詢操作,它會把這個操作的結果放在一級快取中,如果短時間內這個   session(一定要同一個session)又做了同一個操作,那麼hibernate直接從一級快

hibernate一級快取二級快取區別與聯絡

快取是介於應用程式和物理資料來源之間,其作用是為了降低應用程式對物理資料來源訪問的頻次,從而提高了應用的執行效能。快取內的資料是對物理資料來源中的資料的複製,應用程式在執行時從快取讀寫資料,在特定的時刻或事件會同步快取和物理資料來源的資料。   快取的介質一般是記憶體,

Hibernate快取一級快取二級快取

1.什麼是快取?  快取是介於物理資料來源與應用程式之間,是對資料庫中的資料複製一份臨時放在記憶體中的容器,其作用是為了減少應用程式對物理資料來源訪問的次數,從而提高了應用程式的執行效能。Hibernate在進行讀取資料的時候,根據快取機制在相應的快取中查詢,如果在快取中找到了需要的資料(我們把這稱做“快取

hibernate一級快取二級快取機制

Hibernate是一個持久層框架,經常訪問物理資料庫,為了降低應用程式對物理資料來源訪問的頻次,從而提高應用程式的執行效能,hibernate出現了快取機制,總的來說,快取機制是為了減少對資料訪問資料庫的頻率,應用程式從記憶體中讀取持久化物件的速度顯然比到資

hibernate中的一級快取二級快取

package test; import org.hibernate.Session; import com.wxh.dto.People; import com.wxh.sessionfactory.HibernateSessionFactory; public cl

Hibernate一級快取二級快取詳解

一、一級快取二級快取的概念解釋 (1)一級快取就是Session級別的快取,一個Session做了一個查詢操作,它會把這個操作的結果放在一級快取中,如果短時間內這個 session(一定要同一個se

hibernate一級快取二級快取的具體區別

一、Session快取(又稱作事務快取):Hibernate內建的,不能卸除。 快取範圍:快取只能被當前Session物件訪問。快取的生命週期依賴於Session的生命週期,當Session被關閉後,快取也就結束生命週期。 Hibernate一些與一級快取相關的操作(時間點): 資料放入快取: 1. save

MyBatis一級快取二級快取詳解

一級快取   Mybatis對快取提供支援,但是在沒有配置的預設情況下,它只開啟一級快取,一級快取只是相對於同一個SqlSession而言。所以在引數和SQL完全一樣的情況下,我們使用同一個SqlSession物件呼叫一個Mapper方法,往往只執行一次SQL,因為使用SelSession第一次

java試題之Thread的run()start()方法什麼區別

run()方法:   是在主執行緒中執行方法,和呼叫普通方法一樣;(按順序執行,同步執行) start()方法:   是建立了新的執行緒,在新的執行緒中執行;(非同步執行)   public class App { public static void main( Stri

Hive試題:Hive 內部表外部表的區別

建立外部表多了external關鍵字說明以及location path. Hive中表與外部表的區別: 1、在匯入資料到外部表,資料並沒有移動到自己的資料倉庫目錄下,也就是說外部表中的資料並不是由它自己來管理的!而表則不一樣; 2、在刪除表的時候,Hive將會把屬於表的元資料和資料全

mybatis 一級快取二級快取 配置使用

mybatis提供查詢快取,用於減輕資料壓力,提高資料庫效能。 mybaits提供一級快取,和二級快取。 1、一級快取 ​ MyBatis 預設開啟了一級快取,一級快取是在SqlSession 層面進行快取的。即,同一個SqlSession ,多次呼叫同一個Mapp

mybatis 第六篇 MyBatis一級快取二級快取

一、一級快取 1.什麼是一級快取 每當我們使用mybatis開啟一次資料庫會話,mybaits就會建立一個sqlSession物件。 在一次資料庫會話中,當我們執行完全相同的sql語句,為了解決資源浪費

Mybatis之一級快取二級快取

Mybatis的快取 Mybatis的快取,包括一級快取和二級快取 一級快取是預設使用的。 二級快取需要手動開啟。 一級快取 一級快取指的就是sqlsession,在sqlsession中有一個數據區域,是map結構,這個區域就是一級快取區域。一級快取中的key

Mybatis的一級快取二級快取詳解

注:本筆記是根據尚矽谷的MyBatis視訊記錄的 對於任何一個持久層框架,都有快取機制;快取在電腦中有一塊真實的儲存空間(https://baike.baidu.com/item/%E7%BC%93%E5%AD%98/100710?fr=aladdin); 兩個關於mybatis快取額外的連

Mybatis的一級快取二級快取執行順序

1、先判斷二級快取是否開啟,如果沒開啟,再判斷一級快取是否開啟,如果沒開啟,直接查資料庫 2、如果一級快取關閉,即使二級快取開啟也沒有資料,因為二級快取的資料從一級快取獲取 3、一般不會關閉一級快取 4、二級快取預設不開啟 5、如果二級快取關閉,直接判斷一級快取是否有資料,如果沒有就