Hibernate 臟檢查和刷新緩存機制


刷新緩存:

  Session是Hibernate向應用程序提供的操作數據庫的主要接口,它提供了基本的保存,更新,刪除和加載java對象的方法,Session具有一個緩存,可以管理和追蹤所有持久化對象,對象和數據庫中的相關記錄對應,在某些時間點,Session會根據緩存中對象的變化來執行相關SQL語句,將對象包含的變化數據更新到數據庫中,這一過程成為刷新緩存.

臟檢查:

  當刷新緩存時,Hibernate會對Session中的持久狀態的對象進行檢測,判斷對象的數據是否發生了改變,這種判斷成為臟檢查,

臟檢查的原理:

  當一個對象被加入到Session緩存中時,Session會為對象的值類型的屬性復制一份快照.當Session刷新緩存時,會先進行臟檢查,即比較對象的當前屬性與它的快照,來判斷對象的屬性是否發生了改變,如果發生了改變,Session會根據臟對象的最新屬性值來執行相關的SQL語句,將變化更新到數據庫中.

運行結果:

從結果可以看出,sql語句只生成了一次,證明第二次修改經過臟檢查發現數據並沒有進行改變,所以沒有向數據庫發送SQL語句!

緩存清理機制

當Session緩存中對象的屬性每次發生了變化,Session並不會立即清理緩存和執行相關的SQL update語句,而是在特定的時間點才清理緩存,這使得Session能夠把幾條相關的SQL語句合並為一條SQL語句,一遍減少訪問數據庫的次數,從而提高應用程序的數據訪問性能。

在默認情況下,Session會在以下時間點清理緩存。

  1. 當應用程序調用org.hibernate.Transaction的commit()方法的時候.commit方法先清理緩存,然后再向數據庫提交事務。Hibernate之所以把清理緩存的時間點安排在事務快結束時,一方面是因為可以減少訪問數據庫的頻率,還有一方面是因為可以盡可能縮短當前事務對數據庫中相關資源的鎖定時間。
  2. 當應用程序執行一些查詢操作時,如果緩存中持久化對象的屬性已經發生了變化,就會清理緩存,使得Session緩存與數據庫已經進行了同步,從而保證查詢結果返回的是正確的數據。
  3. 當應用程序顯示調用Session的flush()方法的時候。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM