臟檢查
Session到底是如何進行臟檢查的呢?當一個Customer對象被加入到Session緩存中時,Session會為Customer對象的值類型的屬性復制一份快照。當Session清理緩存時,會先進行臟檢查,即比較Customer對象的當前屬性與它的快照,來判斷Customer對象的屬性是否發生了變化,如果發生了變化,就稱這個對象是“臟對象”,Session會根據臟對象的最新屬性來執行相關的SQL語句,從而同步更新數據庫。
緩存清理機制
當Session緩存中對象的屬性每次發生了變化,Session並不會立即清理緩存和執行相關的SQL update語句,而是在特定的時間點才清理緩存,這使得Session能夠把幾條相關的SQL語句合並為一條SQL語句,一遍減少訪問數據庫的次數,從而提高應用程序的數據訪問性能。
在默認情況下,Session會在以下時間點清理緩存。
- 當應用程序調用org.hibernate.Transaction的commit()方法的時候.commit方法先清理緩存,然后再向數據庫提交事務。Hibernate之所以把清理緩存的時間點安排在事務快結束時,一方面是因為可以減少訪問數據庫的頻率,還有一方面是因為可以盡可能縮短當前事務對數據庫中相關資源的鎖定時間。
- 當應用程序執行一些查詢操作時,如果緩存中持久化對象的屬性已經發生了變化,就會清理緩存,使得Session緩存與數據庫已經進行了同步,從而保證查詢結果返回的是正確的數據。
- 當應用程序顯示調用Session的flush()方法的時候。
Session進行清理緩存的例外情況是,如果對象使用native生成器來生成OID,那么當調用Session的save()方法保存該對象時,會立即執行向數據庫插入該實體的insert語句。
來源:《精通Hibernate: Java對象持久化技術詳解(第2版)》孫衛琴:P184