1. 程式人生 > >快取簡介--Cache In Hibernate: @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)

快取簡介--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)