Hibernate一級緩存與二級緩存的區別


一級緩存:
  就是Session級別的緩存。一個Session做了一個查詢操作,它會把這個操作的結果放在一級緩存中。
  如果短時間內這個session(一定要同一個session)又做了同一個操作,那么hibernate直接從一級緩存中拿,而不會再去連數據庫,取數據。
  它是內置的事務范圍的緩存,不能被卸載。
二級緩存:
  就是SessionFactory級別的緩存。顧名思義,就是查詢的時候會把查詢結果緩存到二級緩存中。
  如果同一個sessionFactory創建的某個session執行了相同的操作,hibernate就會從二級緩存中拿結果,而不會再去連接數據庫。
  這是可選的插件式的緩存,在默認情況下,SessionFactory不會啟用這個插件。
  可以在每個類或每個集合的粒度上配置。緩存適配器用於把具體的緩存實現軟件與Hibernate集成。

嚴格意義上說,SessionFactory緩存分為兩類:內置緩存和外置緩存。我們通常意義上說的二級緩存是指外置緩存。

內置緩存與session級別緩存實現方式相似。前者是SessionFactory對象的一些集合屬性包含的數據,后者是指Session的一些集合屬性包含的數據

SessionFactory的內置緩存中存放了映射元數據和預定義SQL語句。
  映射元數據是映射文件中數據的拷貝;
  而預定義SQL語句是在Hibernate初始化階段根據映射元數據推導出來。
SessionFactory的內置緩存是只讀的,應用程序不能修改緩存中的映射元數據和預定義SQL語句,因此SessionFactory不需要進行內置緩存與映射文件的同步。

Hibernate的這兩級緩存都位於持久化層,存放的都是數據庫數據的拷貝。

緩存的兩個特性:
  緩存的范圍
  緩存的並發訪問策略

1、緩存的范圍
  決定了緩存的生命周期以及可以被誰訪問。緩存的范圍分為三類。
  事務范圍
  進程范圍
  集群范圍
  注:
    對大多數應用來說,應該慎重地考慮是否需要使用集群范圍的緩存,因為訪問的速度不一定會比直接訪問數據庫數據的速度快多少。
    事務范圍的緩存是持久化層的第一級緩存,通常它是必需的;進程范圍或集群范圍的緩存是持久化層的第二級緩存,通常是可選的。

2、緩存的並發訪問策略
  當多個並發的事務同時訪問持久化層的緩存的相同數據時,會引起並發問題,必須采用必要的事務隔離措施。

  在進程范圍或集群范圍的緩存,即第二級緩存,會出現並發問題。
  因此可以設定以下四種類型的並發訪問策略,每一種策略對應一種事務隔離級別。
  事務型並發訪問策略是事務隔離級別最高,只讀型的隔離級別最低。事務隔離級別越高,並發性能就越低。

  A 事務型:僅僅在受管理環境中適用。它提供了Repeatable Read事務隔離級別。
      對於經常被讀但很少修改的數據,可以采用這種隔離類型,因為它可以防止臟讀和不可重復讀這類的並發問題。
  B 讀寫型:提供了Read Committed事務隔離級別。僅僅在非集群的環境中適用。
      對於經常被讀但很少修改的數據,可以采用這種隔離類型,因為它可以防止臟讀這類的並發問題。
  C 非嚴格讀寫型:不保證緩存與數據庫中數據的一致性。
      如果存在兩個事務同時訪問緩存中相同數據的可能,必須為該數據配置一個很短的數據過期時間,從而盡量避免臟讀。
      對於極少被修改,並且允許偶爾臟讀的數據,可以采用這種並發訪問策略。
  D 只讀型:對於從來不會修改的數據,如參考數據,可以使用這種並發訪問策略。

什么樣的數據適合存放到第二級緩存中?
  1、很少被修改的數據
  2、不是很重要的數據,允許出現偶爾並發的數據
  3、不會被並發訪問的數據
  4、參考數據

不適合存放到第二級緩存的數據?
  1、經常被修改的數據
  2、財務數據,絕對不允許出現並發
  3、與其他應用共享的數據。

Hibernate的二級緩存策略的一般過程如下:
  1) 條件查詢的時候,總是發出一條select * from table_name where …. (選擇所有字段)這樣的SQL語句查詢數據庫,一次獲得所有的數據對象。
  2) 把獲得的所有數據對象根據ID放入到第二級緩存中。
  3) 當Hibernate根據ID訪問數據對象的時候,首先從Session一級緩存中查;查不到,如果配置了二級緩存,那么從二級緩存中查;查不到,再查詢數據庫,把結果按照ID放入到緩存。
  4) 刪除、更新、增加數據的時候,同時更新緩存。

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

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都要從緩存中清空。

 

轉載至:http://blog.sina.com.cn/s/blog_6a7f00ed0101nau9.html

 


免責聲明!

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



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