緩存能夠簡單的當作一個 Map ,經過 key 在緩存裏面找 value 。java
1、緩存簡介 Cache In Hibernate
HIBERNATE 中的 CACHE 有兩級 .sql
一級是在 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.session
hibernate 查詢緩存 (hibernate 默認是關閉的 )
查詢緩存是針對普通屬性結果集的緩存
對實體對象的結果集只緩存 id
查詢緩存的生命週期,當前關聯的表發生修改,那麼查詢緩存生命週期結束
查詢緩存的配置和使用:
1. 啓用查詢緩存:在 hibernate .cfg.xml 中加入: spa
<property name=」hibernate.cache.use_query_cache」>true</property>
2. 在程序中必須手動啓用查詢緩存,如: query.setCacheable(true);hibernate
QueryCache 用來緩存查詢語句 , 及查詢結果集中對象的 Identifier 與 Type. 當再次使用已緩存的 Query 時 , 就能夠經過對象的 Identifier 與 Type 在SECOND LEVEL CACHE 中查找實際的對象 .日誌
對於查詢緩存來講,緩存的 key 是根據 hql 生成的 sql ,再加上參數,分頁等信息(能夠經過日誌輸出看到,不過它的輸出不是很可讀,最好改一下它的代碼)。code
注:一級緩存也叫 session 級的緩存或事務緩存。 Hibernate 二級緩存也稱爲進程級的緩存或 SessionFactory 級的緩存。二級緩存是全局緩存,它能夠被全部的 session 共享。二級緩存的生命週期和 SessionFactory 的生命週期一致, SessionFactory 能夠管理二級緩存。xml
2、緩存的範圍
緩存的範圍分爲 3 類 :
1. 事務範圍
事務範圍的緩存只能被當前事務訪問 , 每一個事務都有各自的緩存 , 緩存內的數據一般採用相互關聯的對象形式 . 緩存的生命週期依賴於事務的生命週期, 只有當事務結束時 , 緩存的生命週期纔會結束 . 事務範圍的緩存使用內存做爲存儲介質 , 一級緩存就屬於事務範圍 .
2. 應用範圍
應用程序的緩存能夠被應用範圍內的全部事務共享訪問 . 緩存的生命週期依賴於應用的生命週期 , 只有當應用結束時 , 緩存的生命週期纔會結束 . 應用範圍的緩存可使用內存或硬盤做爲存儲介質 , 二級緩存就屬於應用範圍 .
3. 集羣範圍
在集羣環境中 , 緩存被一個機器或多個機器的進程共享 , 緩存中的數據被複制到集羣環境中的每一個進程節點 , 進程間經過遠程通訊來保證緩存中的數據的一致 , 緩存中的數據一般採用對象的鬆散數據形式 .
3、緩存的方式
有四種,分別爲:
CacheConcurrencyStrategy.NONE
CacheConcurrencyStrategy.READ_ONLY ,只讀模式,在此模式下,若是對數據進行更新操做,會有異常;
CacheConcurrencyStrategy.READ_WRITE ,讀寫模式在更新緩存的時候會把緩存裏面的數據換成一個鎖,其它事務若是去取相應的緩存數據,發現被鎖了,直接就去數據庫查詢;
CacheConcurrencyStrategy.NONSTRICT_READ_WRITE ,不嚴格的讀寫模式則不會的緩存數據加鎖;
CacheConcurrencyStrategy.TRANSACTIONAL ,事務模式指緩存支持事務,當事務回滾時,緩存也能回滾,只支持 JTA 環境。
緩存的註釋寫法以下,加在 Entity 的 java 類上:
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)