Hibernate一級緩存

 

1. Hibernate一級緩存sql

Hibernate的一級緩存就是指session緩存。數據庫

 

actionQueue它是一個行列隊列,它主要記錄crud操做的相關信息緩存

persistenceContext它是持久化上下文,它實際上是真正緩存。session

session中定義了一系列的集合來存儲數據,它們構成session緩存。ide

只要session沒有關閉,它就會一直存在。測試

當咱們經過hibernate中的session提供的一些API例如 save  get  update等進行操做時,就會將持久化對象保存到session中,當下一次在去查詢緩存中具備的對象(OID值來判斷)spa

就不會去從數據庫查詢,而是直接從緩存中獲取。hibernate

Hibernate的一級緩存存在的目的就是爲了減小對數據庫訪問。3d

 

hibernate中還有一個二級緩存,它是SessionFactory級別緩存。code

 

1.1.一級緩存的存在

經過第八行斷點,進行查看

 

1.2. 持久化對象具備自動更新數據庫能力(快照更新)

    // 測試一級緩存
    @Test
    public void test3() {
        // 1.獲得session
        Session session = HibernateUtils.openSession();
        session.beginTransaction();

        Customer c = session.get(Customer.class, 1); // 查詢id=1的customer對象,若是查詢到,會將c存儲到一級緩存中。
        Customer cc = session.get(Customer.class, 1); // 會從一級緩存
                                                        // 中查詢,而不會向數據庫在發送sql

        // 2.事務提供,關閉
        session.getTransaction().commit();
        session.close();
    }
// 持久化對象具備自動更新數據庫能力
    @Test
    public void test4() {
        // 1.獲得session
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        Customer c = session.get(Customer.class, 1); // 查詢id=1的customer對象,若是查詢到,會將c存儲到一級緩存中。
        c.setName("tom"); // 操做持久化對象來修改屬性
        // 2.事務提供,關閉
        session.getTransaction().commit();
        session.close();
    }

 

 

爲何持久化對象具備自動更新數據庫能力?

 

 
 

 

1.3. 一級緩存經常使用API

一級緩存特色:

當咱們經過sessionsave,update saveOrupdate進行操做時,若是一級緩存中沒有對象,會將這些對象從數據庫中查詢到,存儲到一級緩存。

當咱們經過sessionload,get,Querylist等方法進行操做時,會先判斷一級緩存中是否存在,若是沒有才會從數據庫獲取,而且將查詢的數據存儲到一級緩存中。

當調用sessionclose方法時,session緩存清空。

 

clea()r 清空一級緩存.

evict(object) 清空一級緩存中指定的一個對象。

      refresh()從新查詢數據庫,用數據庫中信息來更新一級緩存與快照

        close();關閉session時也會清空一級緩存

 
 
 

1.4. Hibernate經常使用API-Session補充

update

udpate操做它主要是針對於脫管對象,持久對象具備自動更新能力。

問題1:若是咱們直接操做的對象是一個脫管對象,執行update會出現什麼狀況?

Update操做時,若是對象是一個脫管對象,能夠操做,

它會將脫管對象轉換成持久對象在操做

若是在session中出現相同的oid兩個對象,會產生異常

問題2脫管對象的oid若是在數據表中不存在,會報異常?

 

因此:在操做中,建議咱們經過持久化對象來直接修改其操做。

 

// 測試一級緩存操做經常使用API
    @Test
    public void test5() {
        // 1.獲得session
        Session session = HibernateUtils.openSession();
        session.beginTransaction();

        // 操做
        List<Customer> list = session.createQuery("from Customer").list(); // 會存儲數據到一級緩存
        session.clear(); // 清空一級緩存
        Customer c = session.get(Customer.class, 1); // 會先從session一級緩存
                                                        // 中獲取,若是不存在,纔會從數據庫獲取
        session.evict(c); // 從一級緩存 中刪除一個指定的對象
        Customer cc = session.get(Customer.class, 1);

        cc.setName("kkkk");

        session.refresh(cc); // 從新查詢數據庫,用數據庫中信息來更新一級緩存與快照

        // 2.事務提供,關閉
        session.getTransaction().commit();
        session.close();
    }

    // session的update操做


@Test
    public void test6() {
        // 1.獲得session
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        
        //獲得id=1的 Customer對象
        //Customer cc=session.get(Customer.class, 1); //session一級緩存中存在了一個oid爲1的Customer

        // 執行update來操做一個脫管對象
        Customer c = new Customer();
        c.setAddress("廣州");
        c.setName("趙六");
        c.setId(11);

        session.update(c); //當執行update時會將c放入到session一級緩存

        // 2.事務提供,關閉
        session.getTransaction().commit();
        session.close();
    }

saveOrUpdate

若是對象是一個瞬時對象 --------執行save操做

若是對象是一個脫管對象---------執行update

若是是一個持久對象-------直接返回

delete

刪除一個脫管對象,與session關聯,在刪除

注意:若是執行delete操做,先刪除一級緩存,在刪除數據庫中的數據。

 

// session的update操做
    @Test
    public void test6() {
        // 1.獲得session
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        
        //獲得id=1的 Customer對象
        //Customer cc=session.get(Customer.class, 1); //session一級緩存中存在了一個oid爲1的Customer

        // 執行update來操做一個脫管對象
        Customer c = new Customer();
        c.setAddress("廣州");
        c.setName("趙六");
        c.setId(11);

        session.update(c); //當執行update時會將c放入到session一級緩存

        // 2.事務提供,關閉
        session.getTransaction().commit();
        session.close();
    }

 

 

 

 

saveOrUpdate

若是對象是一個瞬時對象 --------執行save操做

若是對象是一個脫管對象---------執行update

若是是一個持久對象-------直接返回

delete

刪除一個脫管對象,與session關聯,在刪除

注意:若是執行delete操做,先刪除一級緩存,在刪除數據庫中的數據。

相關文章
相關標籤/搜索