1. 程式人生 > >hibernate一級緩存

hibernate一級緩存

custom action get 分享 print 內存地址 控制 就是 pre

  對象分為三種狀態:瞬時狀態、持久化狀態、遊離狀態.其實我們調用session.save或者session.update或者session.saveOrUpdate只是為了將對象的狀態改變為持久態(將對象存入session一級緩存)。一級緩存

中的對象就是和session關聯,session中有一級緩存區和快照區,執行事務提交的時候會判斷快照中對象和緩存中對應的對象是否一致,如果一致不會執行修改SQL、不一致會執行修改SQL。

1.Hibernate一級緩存介紹:

    技術分享圖片

2.一級緩存也是為了提高操作數據庫的效率.

1.測試一級緩存的存在

    @Test
    
//證明一級緩存存在 public void fun1(){ //1 獲得session Session session = HibernateUtil.openSession(); //2 控制事務 Transaction tx = session.beginTransaction(); //3執行操作 Customer c1 = session.get(Customer.class, 1l); Customer c2 = session.get(Customer.class
, 1l); Customer c3 = session.get(Customer.class, 1l); Customer c4 = session.get(Customer.class, 1l); Customer c5 = session.get(Customer.class, 1l); System.out.println(c3==c5);//true //4提交事務.關閉資源 tx.commit(); session.close();// 遊離|托管 狀態, 有id , 沒有關聯
}

結果:只發出一次SQL請求,而且五個對象的內存地址一樣,證明查詢了一次SQL,然後後四個對象直接取的session緩存的對象。

  由於第一次查詢的時候先從session緩存中取,沒有取到對應的數據,所以發出SQL從數據庫中取出來並且會存到session緩存中; 第二次查詢的時候從session緩存中取數據取到所以不發出SQL。

Hibernate: 
    select
        customer0_.cust_id as cust_id1_0_0_,
        customer0_.cust_name as cust_nam2_0_0_,
        customer0_.cust_source as cust_sou3_0_0_,
        customer0_.cust_industry as cust_ind4_0_0_,
        customer0_.cust_level as cust_lev5_0_0_,
        customer0_.cust_linkman as cust_lin6_0_0_,
        customer0_.cust_phone as cust_pho7_0_0_,
        customer0_.cust_mobile as cust_mob8_0_0_ 
    from
        cst_customer customer0_ 
    where
        customer0_.cust_id=?
true

2.一級緩存提高效率的手段:

(1)查詢的時候提高查詢手段:提高查詢效率,原理如下:

技術分享圖片

(2)減少不必要的修改語句發送

  hibernate在查詢到的數據的時候會將一份存入緩存,一份存入快照,緩存會和內存中的對象保持一致,最後執行事務提交的時候會對比快照中的對象和session中的對象有沒有修改,有修改的話沒執行修改SQL,否則不會發出修改SQL。

    @Test
    //
    public void fun2(){
        //1 獲得session
        Session session = HibernateUtil.openSession();
        //2 控制事務
        Transaction tx = session.beginTransaction();
        //3執行操作
        
        Customer c1 = session.get(Customer.class, 1l);
        
        c1.setCust_name("哈哈");
        c1.setCust_name("測試");
        
        //4提交事務.關閉資源
        tx.commit();
        session.close();// 遊離|托管 狀態, 有id , 沒有關聯
        
        
    }

結果:

Hibernate: 
    select
        customer0_.cust_id as cust_id1_0_0_,
        customer0_.cust_name as cust_nam2_0_0_,
        customer0_.cust_source as cust_sou3_0_0_,
        customer0_.cust_industry as cust_ind4_0_0_,
        customer0_.cust_level as cust_lev5_0_0_,
        customer0_.cust_linkman as cust_lin6_0_0_,
        customer0_.cust_phone as cust_pho7_0_0_,
        customer0_.cust_mobile as cust_mob8_0_0_ 
    from
        cst_customer customer0_ 
    where
        customer0_.cust_id=?

解釋:原來數據庫的Cust_name的值就是測試,所以在兩次修改完成之後還是測試,所以只發出查詢SQL而未發出修改SQL。Hibernate快照的作用就是確保一級緩存中的數據和數據庫中的數據一致。

技術分享圖片

hibernate一級緩存