1.session 一級緩存對象
緩存:經常訪問物理數據庫,為了降低應用程序對物理數據源訪問的頻次,從而提高應用程序的運行性能。緩存內的數據是對物理數據源中的數據的復制(內存中數據,緩存),應用程序在運行時從緩存讀寫數據,在特定的時刻或事件會同步緩存和物理數據源的數據。
1.1 Hibernate 中對象三種狀態
- 臨時(瞬時)狀態對象(TO)
特點:對象沒有 OID 值(對象 id值,標識唯一的對象),不受 session 管理 -
持久化狀態對象(PO)
特點:對象有 OID 值(對象 id值,標識唯一的對象),受 session 管理 - 游離(托管)狀態對象(DO)
特點:對象有 OID 值(對象 id值,標識唯一的對象),不受 session 管理 - 刪除狀態(非官方說法)
對象狀態的轉換:
session 對象方法使用可以影響對象的狀態
圖片.png
1.2 一級緩存區
session 對象的 save、update、get、load、query.list、query.uniqueResult ,query.iterate 等方法執行后,可以把數據放入到一級緩存中
session 對象的 get 、load、 query.iterate方法可以取一級緩存對象數據,而query.list 、 query.uniqueResult 不能取
注意:將來 用 list 方法放,iterate 方法來取,解決了 iterate 的N+1 問題
1.3 快照區
快照區保存的數據是 一級緩存中數據的拷貝,當執行session.flush 方法,或者說在有事務的前提下 tx.commit()(因為提交事務前隱式的執行了session.flush方法),hibernate 就會做 臟數據檢查機制:
快照區域的數據跟 數據庫中的數據一定是一樣的(同步的),如果一級緩存中的數據發生改變,跟快照區中的數據進行匹配,如果有發現有改變,就會發發出去update 語句去更新 一級緩存數據。