緩存簡介--Cache In Hibernate: @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)

緩存可以簡單的看成一個 Map 通過 key 在緩存裏面 value 

 

一、緩存簡介   Cache In Hibernate
HIBERNATE
 中的 CACHE 有兩級 .

一級是在 Session 範圍內的 CACHE . 即每個 Session 有自己的一個 CACHE, 當前操作的對象都會被保留在 CACHE  . 但是 Session 關閉後這個 CACHE 也就沒有 . 可見這級 CACHE 的生命期是很短的 . (使用 id 進行關鍵字存儲:緩存的 key 就是 ID  value  POJO  ( 緩存的是實體對象 )

另一級 CACHE 是在 SessionFactory 範圍 , 可以被來自同一個 SessionFactory  Session  . HIBERNATE 的文檔中稱其爲 SECOND LEVEL CACHE. 顯然後者的優勢較明顯 , 也比較複合當前的使用環境    它可以使用不同的緩存實現,如 EhCache  JBossCache  OsCache  (二級緩存是緩存實體對象的) 

還有一個類型的 CACHE 就是 QueryCache . 它的作用就是緩存一個 Query 以及 Query 返回對象的Identifier 以及對象的類型 . 有了 QueryCache 後就可以高效的使用 SECOND LEVEL CACHE.

hibernate 查詢緩存 (hibernate 默認是關閉的 )
查詢緩存是針對普通屬性結果集的緩存 
對實體對象的結果集只緩存 id
查詢緩存的生命週期,當前關聯的表發生修改,那麼查詢緩存生命週期結束 
查詢緩存的配置和使用: 
1.
 啓用查詢緩存:在 hibernate .cfg.xml 中加入: 
<property name=”hibernate .cache.use_query_cache”>true</property>
2.
 在程序中必須手動啓用查詢緩存,如: query.setCacheable(true);

QueryCache 用來緩存查詢語句 , 及查詢結果集中對象的 Identifier  Type. 當再次使用已緩存的 Query , 就可以通過對象的 Identifier  Type  SECOND LEVEL CACHE 查找實際的對象 .

對於查詢緩存來說,緩存的 key 是根據 hql 生成的 sql ,再加上參數,分頁等信息(可以通過日誌輸出看到,不過它的輸出不是很可讀,最好改一下它的代碼)。

 

 

注:一級緩存也叫 session 級的緩存或事務緩存。 Hibernate 二級緩存也稱爲進程級的緩存或SessionFactory 級的緩存。二級緩存是全局緩存,它可以被所有的 session 共享。二級緩存的生命週期和SessionFactory 的生命週期一致, SessionFactory 可以管理二級緩存。

 

 

二、緩存的範圍

緩存的範圍分爲 3  :
1.
 事務範圍 
     
 事務範圍的緩存只能被當前事務訪問 , 每個事務都有各自的緩存 , 緩存內的數據通常採用相互關聯的對象形式 . 緩存的生命週期依賴於事務的生命週期 , 只有當事務結束時 , 緩存的生命週期纔會結束 . 事務範圍的緩存使用內存作爲存儲介質 , 一級緩存就屬於事務範圍 .
2.
 應用範圍 
     
 應用程序的緩存可以被應用範圍內的所有事務共享訪問 . 緩存的生命週期依賴於應用的生命週期 , 只有當應用結束時 , 緩存的生命週期纔會結束 . 應用範圍的緩存可以使用內存或硬盤作爲存儲介質 , 二級緩存就屬於應用範圍 .
3.
 集羣範圍 
     
 在集羣環境中 , 緩存被一個機器或多個機器的進程共享 , 緩存中的數據被複制到集羣環境中的每個進程節點 , 進程間通過遠程通信來保證緩存中的數據的一致 , 緩存中的數據通常採用對象的鬆散數據形式 .

三、緩存的方式

有四種,分別爲:

   CacheConcurrencyStrategy.NONE

   CacheConcurrencyStrategy.READ_ONLY ,只讀模式,在此模式下,如果對數據進行更新操作,會有異常;

   CacheConcurrencyStrategy.READ_WRITE ,讀寫模式在更新緩存的時候會把緩存裏面的數據換成一個鎖,其它事務如果去取相應的緩存數據,發現被鎖了,直接就去數據庫查詢;

   CacheConcurrencyStrategy.NONSTRICT_READ_WRITE ,不嚴格的讀寫模式則不會的緩存數據加鎖;

   CacheConcurrencyStrategy.TRANSACTIONAL 事務模式指緩存支持事務,當事務回滾時,緩存也能回滾,只支持 JTA 環境。

 

緩存的註釋寫法如下,加在 Entity  java 類上:

   @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)

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