1.session 一級緩存對象
緩存:經(jīng)常訪問物理數(shù)據(jù)庫彻舰,為了降低應用程序對物理數(shù)據(jù)源訪問的頻次伐割,從而提高應用程序的運行性能。緩存內(nèi)的數(shù)據(jù)是對物理數(shù)據(jù)源中的數(shù)據(jù)的復制(內(nèi)存中數(shù)據(jù)刃唤,緩存)隔心,應用程序在運行時從緩存讀寫數(shù)據(jù),在特定的時刻或事件會同步緩存和物理數(shù)據(jù)源的數(shù)據(jù)尚胞。
1.1 Hibernate 中對象三種狀態(tài)
- 臨時(瞬時)狀態(tài)對象(TO)
特點:對象沒有 OID 值(對象 id值硬霍,標識唯一的對象),不受 session 管理 -
持久化狀態(tài)對象(PO)
特點:對象有 OID 值(對象 id值笼裳,標識唯一的對象)唯卖,受 session 管理 - 游離(托管)狀態(tài)對象(DO)
特點:對象有 OID 值(對象 id值,標識唯一的對象)躬柬,不受 session 管理 - 刪除狀態(tài)(非官方說法)
對象狀態(tài)的轉換:
session 對象方法使用可以影響對象的狀態(tài)
1.2 一級緩存區(qū)
session 對象的 save拜轨、update、get允青、load橄碾、query.list、query.uniqueResult ,query.iterate 等方法執(zhí)行后颠锉,可以把數(shù)據(jù)放入到一級緩存中
session 對象的 get 法牲、load、 query.iterate方法可以取一級緩存對象數(shù)據(jù)木柬,而query.list 皆串、 query.uniqueResult 不能取
注意:將來 用 list 方法放,iterate 方法來取眉枕,解決了 iterate 的N+1 問題
1.3 快照區(qū)
快照區(qū)保存的數(shù)據(jù)是 一級緩存中數(shù)據(jù)的拷貝恶复,當執(zhí)行session.flush 方法,或者說在有事務的前提下 tx.commit()(因為提交事務前隱式的執(zhí)行了session.flush方法)速挑,hibernate 就會做 臟數(shù)據(jù)檢查機制:
快照區(qū)域的數(shù)據(jù)跟 數(shù)據(jù)庫中的數(shù)據(jù)一定是一樣的(同步的)谤牡,如果一級緩存中的數(shù)據(jù)發(fā)生改變,跟快照區(qū)中的數(shù)據(jù)進行匹配姥宝,如果有發(fā)現(xiàn)有改變翅萤,就會發(fā)發(fā)出去update 語句去更新 一級緩存數(shù)據(jù)。