1. 程式人生 > >hibernate學習(四)hibernate的一級緩存&快照

hibernate學習(四)hibernate的一級緩存&快照

class 執行 設置 update 原理 查看 技術分享 pri 比對

緩存:提高效率

硬件的 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的一級緩存&快照