1. 程式人生 > >一級快取和二級快取的區別

一級快取和二級快取的區別

什麼是快取?

快取是介於應用程式和物理資料來源之間,是為了降低應用程式對物理資料來源的訪問頻率,從而提高應用程式的執行效能。

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

hibernante快取包括session的快取和sessionFactory的快取,其中sessionFactory快取分為兩類:內建快取和快取。Session的快取是內建的,不能被解除安裝,也被成為一級快取。

SessionFactory的外接快取是一個可配置的外掛,在預設情況下,SessionFactory不會啟用這個外掛,外接快取的資料是資料庫的拷貝,外接快取的介質可以是記憶體和硬碟,SessionFactory的外接快取也被稱為Hibernante的二級快取。

SessionFactory的內建快取和Session的快取實現方式上比較相似,前者是SessionFactory物件的一些集合屬性包含的資料,後指的是Session的一些集合屬性包含的資料,SessionFactory的內建快取中存放了對映元資料和預定義的SQL語句,對映元資料是對映檔案中資料的拷貝,而預定義sql語句是在hibernate初始化階段根據對映元資料推到出來的,SessionFactory的內建快取只是只讀的,應用程式不能修改快取中的對映元資料和預定義sql語句,因此,sessionFactory不需要進行內建與對映檔案的同步。

Hibernate的兩級快取都位於持久化層,存放的都是資料庫資料的拷貝,那麼他們有什麼區別,為了理解二者的區別,需要審理理解持久化的快取兩個特性。

快取範圍和快取併發訪問策略。

持久化層的快取範圍決定了生命週期以及可以被誰訪問。快取的範圍分為三類:事務範圍、程序範圍和叢集範圍。。

事務範圍:快取只能被當前事務訪問。

程序範圍:快取被程序內的所有事務共享。

叢集範圍:在叢集環境中,快取被一個機器或者多個機器的程序共享。慎用。

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

持久化層的快取的併發訪問策略

當多個事務同時訪問持久層的快取資料時,會引起併發問題,必須採取必要的事務隔離措施。

在程序範圍或者叢集範圍的快取,即二級快取,會出現併發問題,可以設定四中併發隔離策略,每一種策略對應一種事務隔離級別。

事務型:僅僅在受管理環境中適用。

它提供了Repeatable Read事務隔離級別,對於經常被讀但很少修改的資料,可以採取這種隔離型別,因為他可以防止髒讀和不可重複讀這類的併發問題。

讀寫型:修改了Read Committed事務隔離級別。

僅僅在非叢集的環境中適用。對於經常被讀但很少修改的資料,可以採取這種隔離型別,可以防止髒讀這類併發問題。

非嚴格讀寫型:不保證快取與資料庫中資料的一致性。

如果存在兩個事務同時訪問快取中相同資料的可能,必須為該資料配置一個很短的資料過期時間,從而避免髒讀;對於極少被修改,並且允許偶爾髒讀的資料,可以採取這種併發訪問策略。

只讀型:

對於從來不會修改,如參考資料,可以使用這類併發訪問策略。

二級快取適合存放的資料:

1,很少被修改的資料

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

3,不會被併發訪問的資料

4,參考資料

二級快取不適合存放的資料:

1,經常被修改的資料

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

3,與其他應用共享的資料。

如上所述: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都要從快取中清空。