hibernate學習(四)hibernate的一級緩存&快照
緩存:提高效率
硬件的 CPU緩存 硬盤緩存 內存
軟件的 io流緩存
hibernate 的一級緩存 也是為了操作數據庫的效率。
證明一級緩存在 :
Person p=session .get(Person.class, 1);
Person p1=session.get(Person.class,2);
Person p2=session.get(Person.class,3);
System.out.println(p=p1);
控制臺輸出為:
select * from person where id=1;
true
緩存原理:
快照
當代碼變為:
註:原始數據庫person表中的第一條數據的name值為 "張三"
Person p=session.get(Person.class,1);
p.setName("zhangsan");
p.setName("張三");
執行後控制臺上顯示為
select * from person where id=1;
查看數據庫person表中的數據 id為1 name="張三"
這裏就運用到了hibernate 的快照:
提高效率: 1.提高查詢效率 (緩存原理) 2.減少不必要的修改語句發送 (快照)
從緩存上看 hibernate對象狀態 :
1.瞬時狀態 :沒有id ,沒有在session緩存中
2.持久化狀態: 有id ,在session緩存中
3. 遊離/托管 狀態 :有id 沒與在緩存中
對快照的更深一步了解 : 以下代碼 截取測試方法中的部分主要的代碼
.........
Person p=new Person(); // 瞬時狀態
p.setId(1); // 遊離狀態 , 有id沒有在session中緩存
session.update(p); // 持久化狀態 ,有id 在session中緩存
Person p=session.get(Person.class, 1);
tx.commit();
.........
在person p =new Person(); 設置一個斷點 ,debug模式執行查看控制臺中的SQL語句顯示
直至運行到Person p= session.get(Person.class ,1); 控制臺輸出 update Person set name=? age= ? sex=? where id=?
出現該現象的原因是 : 對象是通過update 變為持久化狀態 ,沒有通過get方法 把對象放入快照中 ,
當 事物提交中後 會執行 第九步:對象和快照中的對象進行比對, 如果不相同就執行update 語句 ; 沒有快照也就不相同所以就執行update語句
hibernate學習(四)hibernate的一級緩存&快照