Hibernate之緩存機制

本文來自動力節點課堂
鏈接:https://pan.baidu.com/s/1nRB8iPKc25yTx0JRXGcy-Q 密碼:ws2w

1、緩存的分類:

  • 事務範圍的緩存
    hibernate的一級緩存屬於事務範圍的緩存,是單session緩存。當事務結束的時候,緩存的生命週期也會結束。事務緩存是以內存作爲緩存介質的。
  • 應用範圍的緩存
    hibernate的二級緩存屬於應用範圍的緩存,是單SessionFactory緩存。它可以被應用範圍內的所有事務訪問,當應用結束的時候緩存生命週期結束。它是以內存或硬盤做爲緩存介質
  • 集羣範圍的緩存
    是多SessionFactory緩存,在集羣環境中,在一臺或者多態機器的進程共享。

2、一級緩存

一級緩存不能被取消,是由hibernate管理的。
證明一級緩存存在的方案:
這裏寫圖片描述
結果:控制檯只會查詢一次數據庫,第二次從緩衝區讀取

3、快照

概念:快照是數據庫的副本,快照始終和數據庫的數據保持一致。

3.1 快照的作用

這裏寫圖片描述
說明:雖然沒有調用update(),但是在提交之後數據庫的數據還是修改了,通過比較堆中的數據和快照的數據是否一致來決定是否執行更新,這體現了快照的起了作用。
補充:快照的目的就是爲了提高性能,因爲快照的數據和數據庫是保持一致的,所以我們可以提前比較快照的數據和要向數據更新的數據是否一致,這樣可以避免向數據更新相同的數據,而快照是放在內存中的,這相比從數據庫中獲取數據效率是提高很多的。

3.2 刷新點和同步

Session的刷新點是指Session緩存中的數據更新,Session的同步是指Session的數據同步到DB。
Session刷新點有:

  1. 執行query()查詢
  2. 執行session.flush()
  3. 執行事務的提交

Session同步點只有一個:事務的提交
ps:Session的刷新點可以修改,通過setFlushMode()來修改。

3.2.1 刪除操作與刷新點

這裏寫圖片描述
說明:數據庫的數據沒有被刪除,因爲沒有提交事務,所以緩存中的數據更新不會同步到數據庫

3.2.2 修改操作與刷新點

這裏寫圖片描述
結論:只有到了刷新點纔有可能執行update語句,如果修改的內容和快照的結果一致,這時候是不執行update操作的,否則執行,這點和“刪除操作與刷新點”是不同的。

3.2.3 插入操作與刷新點

這裏寫圖片描述
說明:不等到刷新點的到來,在執行save()方法就會執行insert,這點又是和刪除、更新不一樣的。

4、二級緩存

二級緩存被稱爲SessionFactory級的緩存,它的生命週期和應用的生命週期一致的。
SessionFactory緩存分爲兩種:內置和外置。
SessionFactory的內置緩存存放了映射元數據和預定義SQL語句,SessionFactory的外置緩存也被稱爲Hibernate的二級緩存。
二級緩存的數據一般爲只讀的,因爲所有的session都共享一個SessionFactory,所以如果能修改的話會出現髒讀的情況。
Hibernate只提供了二級緩存的規範,需要第三方的插件,例如Ehcache.
二級緩存和一級緩存的對象是不一樣的

待續。。。。。。

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