1. 程式人生 > >Hibernate----一級快取

Hibernate----一級快取

1.  快取:Hibernate中也存在快取. Hibernate中存在的快取也是用來提高效率.
2.  Hibernate中存在兩種快取:
                1)執行緒級別的快取. Session快取  
                2)程序級別的快取. Hibernate 二級快取

3.  session快取: 就是session物件中存在的快取.快取中存在的是(持久化)物件.


    快取中的快照: 在從資料庫取得資料時, 會將資料一式兩份,一份作為快取中的物件,一份作為快照.
                      在session提交時作為對比.



package com.itheima.b_cache;

import org.hibernate.Session;
import org.junit.Test;

import com.itheima.domain.User;
import com.itheima.utils.HibernateUtils;
//session快取
public class Demo1 {
    @Test
    //證明session快取的存在
    public void fun1(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //------------------------------------------------
        User u1 = (User) session.get(User.class, 1);// 傳送select語句,從資料庫取出記錄.並封裝成物件


                                                                                // 持久化狀態物件=> 存到快取中        
        User u2 = (User) session.get(User.class, 1);//再次查詢時,會從快取中查詢,不會發送select

        User u3 = (User) session.get(User.class, 1);//再次查詢時,會從快取中查詢,不會發送select
        
        System.out.println(u1==u2);//true
        System.out.println(u1==u3);//true
        //------------------------------------------------
        session.getTransaction().commit();
        session.close(); // 遊離狀態
    }


//
    @Test
    //session快取中的快照
    public void fun2(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //------------------------------------------------
        User u1 = (User) session.get(User.class, 1);// 傳送select語句,從資料庫取出記錄.並封裝成物件   
        session.update(u1);      
        //------------------------------------------------
        session.getTransaction().commit();
        session.close(); // 遊離狀態
    }
    
    @Test
    //session快取中的快照
    public void fun3(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //------------------------------------------------
        User u1 = new User();
        u1.setId(1);
        u1.setName("jerry");
        u1.setPassword("1234");
      

        session.update(u1);
        //------------------------------------------------
        session.getTransaction().commit();
        session.close(); // 遊離狀態
    }


  @Test
    //感受一級快取效率的提高
    public void fun4(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //------------------------------------------------
        User u1 = (User) session.get(User.class, 1);
        
        u1.setName("tom");
        session.update(u1);
        u1.setName("jack");
        session.update(u1);
        u1.setName("rose");
        session.update(u1);
        //------------------------------------------------
        session.getTransaction().commit();
        session.close(); // 遊離狀態
    }
    // 持久化狀態: 本質就是存在快取中的物件,就是持久化狀態.
       
}