【JavaWeb框架學習】之Hibernate緩存機制、一級緩存和二級緩存介紹

原文地址::http://www.cnblogs.com/wean/archive/2012/05/16/2502724.html   如有侵權請聯繫我!


一、why(爲什麼要用Hibernate緩存?)
Hibernate是一個持久層框架,經常訪問物理數據庫。
爲了降低應用程序對物理數據源訪問的頻次,從而提高應用程序的運行性能。
緩存內的數據是對物理數據源中的數據的複製,應用程序在運行時從緩存讀寫數據,在特定的時刻或事件會同步緩存和物理數據源的數據。
 
二、what(Hibernate緩存原理是怎樣的?)Hibernate緩存包括兩大類:Hibernate一級緩存和Hibernate二級緩存。
1.Hibernate一級緩存又稱爲“Session的緩存”。
Session內置不能被卸載,Session的緩存是事務範圍的緩存(Session對象的生命週期通常對應一個數據庫事務或者一個應用事務)。
一級緩存中,持久化類的每個實例都具有唯一的OID。
2.Hibernate二級緩存又稱爲“SessionFactory的緩存”。
由於SessionFactory對象的生命週期和應用程序的整個過程對應,因此Hibernate二級緩存是進程範圍或者集羣範圍的緩存,有可能出現併發問題,因此需要採用適當的併發訪問策略,該策略爲被緩存的數據提供了事務隔離級別。
第二級緩存是可選的,是一個可配置的插件,默認下SessionFactory不會啓用這個插件。
Hibernate提供了org.hibernate.cache.CacheProvider接口,它充當緩存插件與Hibernate之間的適配器。
什麼樣的數據適合存放到第二級緩存中?   
1) 很少被修改的數據   
2) 不是很重要的數據,允許出現偶爾併發的數據   
3) 不會被併發訪問的數據   
4) 常量數據   
不適合存放到第二級緩存的數據?   
1) 經常被修改的數據   
2) 絕對不允許出現併發訪問的數據,如財務數據,絕對不允許出現併發   
3) 與其他應用共享的數據。
 
3.Session的延遲加載實現要解決兩個問題:正常關閉連接和確保請求中訪問的是同一個session。
Hibernate session就是java.sql.Connection的一層高級封裝,一個session對應了一個Connection。
http請求結束後正確的關閉session(過濾器實現了session的正常關閉);延遲加載必須保證是同一個session(session綁定在ThreadLocal)。
 
4.Hibernate查找對象如何應用緩存?
當Hibernate根據ID訪問數據對象的時候,首先從Session一級緩存中查;
查不到,如果配置了二級緩存,那麼從二級緩存中查;
如果都查不到,再查詢數據庫,把結果按照ID放入到緩存刪除、更新、增加數據的時候,同時更新緩存。
 
5.一級緩存與二級緩存的對比圖。

 

一級緩存

二級緩存

存放數據的形式

相互關聯的持久化對象

對象的散裝數據

緩存的範圍

事務範圍,每個事務都擁有單獨的一級緩存

進程範圍或集羣範圍,緩存被同一個進程或集羣範圍內所有事務共享

併發訪問策略

由於每個事務都擁有單獨的一級緩存不會出現併發問題,因此無須提供併發訪問策略

由於多個事務會同時訪問二級緩存中的相同數據,因此必須提供適當的併發訪問策略,來保證特定的事務隔離級別

數據過期策略

處於一級緩存中的對象永遠不會過期,除非應用程序顯示清空或者清空特定對象

必須提供數據過期策略,如基於內存的緩存中對象的最大數目,允許對象處於緩存中的最長時間,以及允許對象處於緩存中的最長空閒時間

物理介質

內存

內存和硬盤,對象的散裝數據首先存放到基於內存的緩存中,當內存中對象的數目達到數據過期策略的maxElementsInMemory值,就會把其餘的對象寫入基於硬盤的緩存中

緩存軟件實現

在Hibernate的Session的實現中包含

由第三方提供,Hibernate僅提供了緩存適配器,用於把特定的緩存插件集成到Hibernate中

啓用緩存的方式

只要通過Session接口來執行保存,更新,刪除,加載,查詢,Hibernate就會啓用一級緩存,對於批量操作,如不希望啓用一級緩存,直接通過JDBCAPI來執行

用戶可以再單個類或類的單個集合的粒度上配置第二級緩存,如果類的實例被經常讀,但很少被修改,就可以考慮使用二級緩存,只有爲某個類或集合配置了二級緩存,Hibernate在運行時纔會把它的實例加入到二級緩存中

用戶管理緩存的方式

一級緩存的物理介質爲內存,由於內存的容量有限,必須通過恰當的檢索策略和檢索方式來限制加載對象的數目,Session的evit()方法可以顯示的清空緩存中特定對象,但不推薦

二級緩存的物理介質可以使內存和硬盤,因此第二級緩存可以存放大容量的數據,數據過期策略的maxElementsInMemory屬性可以控制內存中的對象數目,管理二級緩存主要包括兩個方面:選擇需要使用第二級緩存的持久化類,設置合適的併發訪問策略;選擇緩存適配器,設置合適的數據過期策略。SessionFactory的evit()方法也可以顯示的清空緩存中特定對象,但不推薦


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章