Hibernate緩存機制

1、爲什麼要用緩存?
        Hibernate是一個持久層框架,經常訪問物理數據庫。爲了降低應用程序對物理數據源訪問的頻次,從而提高應用程序的運行性能。緩存內的數據是對物理數據源中的數據的複製,應用程序在運行時從緩存讀寫數據,在特定的時刻或事件會同步緩存和物理數據源的數據。
2、緩存原理?
         
        Hibernate緩存包括兩大類:Hibernate一級緩存和Hibernate二級緩存。
        1)Hibernate一級緩存又稱爲“Session的緩存”。Session內置不能被卸載,Session的緩存是事務範圍的緩存。一級緩存是緩存實體對象的
        2)Hibernate二級緩存又稱爲“SessionFactory的緩存”或者進程級的緩存二級緩存可以被所有的session共享,二級緩存的生命週期和SessionFactory的生命週期一致,SessionFactory可以管理二級緩存,但有可能出現併發問題,因此需要採用適當的併發訪問策略,該策略爲被緩存的數據提供了事務隔離級別。二級緩存主要是緩存實體對象的
       3) 什麼樣的數據適合存放到第二級緩存中?   
1) 很少被修改的數據   
2) 不是很重要的數據,允許出現偶爾併發的數據   
3) 不會被併發訪問的數據   
4) 常量數據   
4)不適合存放到第二級緩存的數據?   
1) 經常被修改的數據   
2) 絕對不允許出現併發訪問的數據,如財務數據,絕對不允許出現併發   
3) 與其他應用共享的數據。
3、緩存的應用
        1)一級緩存
                 
        /**
         * 在同一個session中,發出兩次load查詢
         */
        public void testLoad1(){
            Session session=null;
            try{
                session=HibernateUtils.getSession();
                session.beginTransaction();
                
                Student student=(Student)session.load(Student.class, 1);
                System.out.println(student.getName());
                
                //不會發出查詢語句,load使用緩存
                student=(Student)session.load(Student.class, 1);
                System.out.println(student.getName());
                
                session.getTransaction().commit();
            }catch(Exception e){
                e.printStackTrace();
                session.getTransaction().rollback();
            }finally{
                HibernateUtils.closeSession(session);
            }
        }

2)二級緩存的配置
    1)將ehcache.xml文件拷貝到src
    2)在hibernate.cfg.xml文件中加入緩存產品提供商
      <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
    3)啓用二級緩存,這也是它的默認配置
        <property name="hibernate.cache.use_second_level_cache">true</property>
    4)指定哪些實體類使用二級緩存
        可以在映射文件中採用<cache>標籤中指定或在hibernate.cfg.xml文件中統一指定
        注意使用的策略,通常使用read-only和read-write
        <!-- 配置使用二級緩存的類 -->
        <class-cache usage="read-only" class="com.tgb.hibernate.Student"/>
    5)緩存原則:通常讀遠遠大於寫的數據進行緩存
    6)注意大批量數據更新時,如果配置了二級緩存,建議禁用一級緩存和二級緩存的交互
        try{
            session=HibernateUtils.getSession();
            session.beginTransaction();

              //從二級緩存中清除id爲1的Student對象
            sessionFactory.evict(Student.class, new Integer(1));  
            //禁止將一級緩存中的數據放到二級緩存中
            session.setCacheMode(CacheMode.IGNORE);
            Student student=(Student)session.load(Student.class, 1);
            System.out.println(student.getName());
            
            //不會發出查詢語句,因爲配置了二級緩存,session可以共享二級緩存中的數據
            //二級緩存是進程級的緩存
            student=(Student)session.load(Student.class, 1);
            System.out.println(student.getName());
            
            session.getTransaction().commit();
        }catch(Exception e){
            e.printStackTrace();
            session.getTransaction().rollback();
        }finally{
            HibernateUtils.closeSession(session);
        } 


       總結:雖然緩存幫我們提高了性能問題,但是卻增加了維護的工作量,比如說我要進行增刪改操作的時候,還需要同時更新緩存,以保證數據的正確性。所以說在方面某一方面的時候必定會降低其他方面,沒有好與不好,合理利用就行。    
發佈了159 篇原創文章 · 獲贊 243 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章