1. 程式人生 > >hibernate的一級快取和二級快取機制

hibernate的一級快取和二級快取機制

 Hibernate是一個持久層框架,經常訪問物理資料庫,為了降低應用程式對物理資料來源訪問的頻次,從而提高應用程式的執行效能,hibernate出現了快取機制,總的來說,快取機制是為了減少對資料訪問資料庫的頻率,應用程式從記憶體中讀取持久化物件的速度顯然比到資料庫中查資料速度快多了,因此快取可以提高資料訪問的效能。

hibernate將快取分為一級快取和二級快取
一、一級快取:
1、Hibenate中的一級快取,也叫做session的快取,它是內建的,同時這種快取不具有可選性,不可以取消session快取,它可以在session範圍內減少資料庫的訪問次數!只在session範圍有效!Session關閉,一級快取失效!
2、當呼叫session的save/saveOrUpdate/get/load/list/iterator方法的時候,如果session快取中還不存在相應的物件,Hibernate會把該物件加入到一級快取中,當Session關閉的時候該Session所管理的一級快取也會立即被清除。
3、當程式呼叫get(),load(),iterate(查詢實體物件才支援一級快取,查詢普通屬性則不支援一級快取)時,Hibernate會先到快取中去拿,如果快取中已經存在目標物件,則直接拿來而不再查詢資料庫,否則,必須發出查詢語句到資料庫中查。
4、Session的快取由hibernate維護,使用者不能操作快取內容;如果想操作快取內容,必須通過hibernate提供的
session.flush();讓一級快取與資料庫同步
session.evict(arg0);清空一級快取中指定的物件
session.clear();清空一級快取中快取的所有物件方法操作。

對於一級快取,在(當前)session範圍有效,作用時間短,效果不是特別明顯!在短時間內多次操作資料庫,效果比較明顯!

二、二級快取
Hibernate提供了基於應用程式級別(對整個應用程式都有效)的快取,可以跨多個session,即不同的session都可以訪問快取資料。這個快取也叫二級快取。Hibernate提供的二級快取有預設的實現,且是一種可插配的快取框架!如果使用者想用二級快取,只需要在hibernate.cfg.xml中配置即可,如果開啟了二級快取,hibernate在執行任何一次查詢的之後,都會把得到的結果集放到快取中,快取結構可以看成是Map的key-value, key是資料庫記錄的id,value是id對應的pojo物件
而如果不想用,直接移除,不影響程式碼。

    在預設情況下, SessionFactory 不會啟用這個快取外掛. 外接快取中的資料是資料庫資料的複製, 外接快取的物理介質可以是記憶體或硬碟,list() 預設情況只會放入快取,不會從一級快取中取!使用查詢快取,可以讓list()查詢從二級快取中取!
<!-- a.  開啟二級快取 -->
        <property name="hibernate.cache.use_second_level_cache">true</property>
        <!-- b. 指定使用哪一個快取框架(預設提供的) -->
        <property
name="hibernate.cache.provider_class">
org.hibernate.cache.HashtableCacheProvider </property> <!--開啟查詢快取 --> <property name="hibernate.cache.use_query_cache">true</property> <!-- c. 指定哪一些類,需要加入二級快取 --> <class-cache usage="read-write" class="cn.itcast.b_second_cache.Dept"/> <class-cache usage="read-only" class="cn.itcast.b_second_cache.Employee"/> <!--集合快取[集合快取的元素物件,也加加入二級快取] --> <collection-cache usage="read-write" collection="cn.itcast.b_second_cache.Dept.emps"/>
    對於二級快取和一級快取主要的不同是它們的作用範圍不同。一級快取是session級別的。也就是隻有在同一個session裡快取才起作用。而二級快取是sessionFactory級別的。其快取對同一個sessionFactory生產出來的session都有效,有可能出現併發問題。

三、最後:
二級快取一般存放: 
1 很少被修改的資料   
2 不是很重要的資料,允許出現偶爾併發的資料   
3 不會被併發訪問的資料   

不適合存放到第二級快取的資料?   
1。經常被修改的資料   
2 .絕對不允許出現併發訪問的資料,如財務資料,絕對不允許出現併發
3 與其他應用共享的資料。

Hibernate開啟二級快取後如何查詢物件?
1、當Hibernate根據ID訪問資料物件的時候,首先從Session一級快取中查;查不到,如果配置了二級快取,那麼從二級快取中查;如果都查不到,再查詢資料庫,把結果按照ID放入到快取 刪除、更新、增加資料的時候,同時更新快取 Hibernate管理快取例項
2、我們在管理Hibernate快取時,當你給save()、update()或saveOrUpdate()方法傳遞一個物件時,或使用load()、 get()、list()、iterate() 或scroll()方法獲得一個物件時, 該物件都將被加入到Session的內部快取中。 當隨後flush()方法被呼叫時,物件的狀態會和資料庫取得同步。