Hibernate中的一級緩存、二級緩存和懶加載


1.為什么使用緩存

  hibernate使用緩存減少對數據庫的訪問次數,從而提升hibernate的執行效率。hibernate中有兩種類型的緩存:一級緩存和二級緩存。

2.一級緩存

  Hibenate中一級緩存,也叫做session的緩存,當調用session的save/saveOrUpdate/get/load/list/iterator方法的時候,都會把對象放入session的緩存中。

  一級緩存可以在session范圍內減少數據庫的訪問次數,只在session范圍有效,session關閉,一級緩存失效。

  session的緩存由hibernate維護, 用戶不能操作緩存內容; 如果想操作緩存內容,必須通過hibernate提供的evit/clear方法操作。

特點:

         只在當前session范圍有效,作用時間短,效果不是特別明顯!

         在短時間內多次操作數據庫,效果比較明顯!

list和iterator的區別

list:

一次把所有的記錄都查詢出來

會放入緩存,但不會從緩存中獲取數據

Iterator:

N+1查詢; N表示所有的記錄總數,即會先發送一條語句查詢所有記錄的主鍵(1),再根據每一個主鍵再去數據庫查詢(N)

會放入緩存,也會從緩存中取數據

    public void test5()throws Exception{
        Session session = sf.openSession();
        session.beginTransaction();

        User user = new User();
        user.setUserName("林黛玉");
        session.save(user);
        user.setUserName("嘉寶");
        session.save(user);
        session.getTransaction().commit();
        session.close();
    }

  由於一級緩存的作用,user對象只會被保存一次。

3.二級緩存

Hibernate提供了基於應用程序級別的緩存, 可以跨多個session,即不同的session都可以訪問緩存數據。 這個緩存也叫二級緩存。

Hibernate提供的二級緩存有默認的實現,且是一種可插配的緩存框架!如果用戶想用二級緩存,只需要在hibernate.cfg.xml中配置即可; 不想用,直接移除,不影響代碼。如果用戶覺得hibernate提供的框架框架不好用,自己可以換其他的緩存框架或自己實現緩存框架。

開啟二級緩存:

list() 默認情況只會放入緩存,不會從一級緩存中取,配置查詢緩存,可以讓list()查詢從二級緩存中取數據。

        <!--開啟二級緩存-->
        <property name="hibernate.cache.use_second_level_cache">true</property>
        <!--指定使用的緩存框架-->
        <property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>

        <!--開啟查詢緩存-->
        <property name="hibernate.cache.use_query_cache">true</property>

  指定需要二級緩存的類:

  如果設置了集合緩存,集合所屬的元素對象也要放入二級緩存,即Employee。

        <!--指定哪一些類需要加入二級緩存-->
        <class-cache class="com.juaner.department.Employee" usage="read-only"/>
        <class-cache class="com.juaner.department.Dept" usage="read-only"/>
        <!--集合緩存,集合所屬的類型也要放入二級緩存-->
        <collection-cache collection="com.juaner.department.Dept.emps" usage="read-only"/>

  使用二級緩存:

  如果設置了查詢緩存,需要手動設置setCacheable(true)。

   @Test
    public void test1(){
        Session session = sf.openSession();
        session.beginTransaction();
        //setCacheable 指定從二級緩存中找,或放入二級緩存,針對list不從一級緩存中取數據的情況
        //從緩存中讀數據,查詢條件必須一致
        //緩存機制為Map<條件,結果>
        Query query = session.createQuery("from Dept").setCacheable(true);
        System.out.println(query.list());

        session.getTransaction().commit();
        session.close();

        Session session1 = sf.openSession();
        session1.beginTransaction();

        query = session1.createQuery("from Dept").setCacheable(true);
        System.out.println(query.list());

        session1.getTransaction().commit();
        session1.close();
    }

4.get和load

get: 及時加載,只要調用get方法立刻向數據庫查詢

load:默認使用懶加載,當用到數據的時候才向數據庫查詢

5.懶加載

  當用到數據的時候才向數據庫查詢,這就是hibernate的懶加載特性。

lazy 值

     true     使用懶加載

     false    關閉懶加載

     extra   在集合數據懶加載時候提升效率,在真正使用數據的時候才向數據庫發送查詢的sql,如果調用集合的size()/isEmpty()方法,只是統計,不真正查詢數據!

       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM