快取簡介--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
還有一個型別的 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
對於查詢快取來說,快取的 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)