Hibernate中 一 二級緩存及查詢緩存學習總結

Hibernate中 一 二級緩存及查詢緩存的學習總結

文章分類:Java編程 關鍵字: hibernate cache

最近趁有空學習了一下Hibernate的緩存,其包括一級緩存,二級緩存和查詢緩存(有些是參照網絡資源的):

一、一級緩存
    一級緩存的生命週期和session的生命週期一致,當前sessioin一旦關閉,一級緩存就消失,因此一級緩存也叫

session級的緩存或事務級緩存,一級緩存只存實體對象的 ,它不會緩存一般的對象屬性(查詢緩存可以),即當獲得

對象後,就將該對象的緩存起來,如果在同一session中如果再去獲取這個對象時,它會先判斷緩存中有沒有該對象的

ID,如果有就直接從緩存中取出,反之則去數據庫中取,取的同時將該對象的緩存起來,有以下方法可以支持一級緩存


    * get()
    * load()
    * iterate(查詢實體對象)
其中 Query 和Criteria的list() 只會緩存,但不會使用緩存(除非結合查詢緩存)。



二、二級緩存
    二級緩存也稱進程級的緩存或SessionFactory級的緩存,二級緩存可以被所有的session共享,二級緩存的生命周

期和SessionFactory的生命週期一致。hibernate爲實現二級緩存,只提供二級緩存的接口供第三方來實現(具體可以

查看http://www.redsaga.com/hibernate-ref/3.2/html/performance.html#performance-cache)。二級緩存也是緩存實體對象 ,其實現原理與一級緩存的差不多吧,其方法與一級的相同,只是緩存的生命週期不一樣而已:
    * get()
    * load()
    * iterate(查詢實體對象)
其中 Query 和Criteria的list() 只會緩存,但不會使用緩存(除非結合查詢緩存)。
二級緩存的配置和使用:
    * 將echcache.xml文件拷貝到src下
    * 開啓二級緩存,修改hibernate.cfg.xml文件
    <property name="hibernate.cache.use_second_level_cache">true</property>
    * 指定緩存產品提供商,修改hibernate.cfg.xml文件
    <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
    * 指定那些實體類使用二級緩存(兩種方法)
        * 在映射文件中採用<cache>標籤
        * 在hibernate.cfg.xml文件中,採用<class-cache>標籤
其緩存策略有read-only,read-write,nonstrict-read-write,transactional,(詳細查看http://www.redsaga.com/hibernate-ref/3.2/html/performance.html#performance-cache 這裏有詳細介紹;)
這裏的緩存策略是針對你緩存裏面的對象而言的,就比如read-only,它是限制緩存中的對象不能被修改的。


三、查詢緩存
    查詢緩存是針對普通屬性結果集的緩存,對實體對象的結果集只緩存id(其ID不是對象的真正ID,它與查詢的條件

相關即where後的條件相關,不同的查詢條件,其緩存的id也不一樣)
,查詢緩存的生命週期,當前關聯的表發生修改

或是查詢條件改變時,那麼查詢緩存生命週期結束,它不受一級緩存 和二級緩存 的生命週期的影響,要想使用查詢緩

存需要手動配置如下:
    * 在hibernate.cfg.xml文件中啓用查詢緩存,如:
    <property name="hibernate.cache.use_query_cache">true</property>
    * 在程序中必須手動啓用查詢緩存,如:
    query.setCacheable(true);

其中 Query 和Criteria的list() 就可利用到查詢緩存了。

總結:(引用網絡上前輩的話)
不要想當然的以爲緩存一定能提高性能,僅僅在你能夠駕馭它並且條件合適的情況下才是這樣的。hibernate的二級緩存限制還是比較多的,不方便用jdbc可能會大大的降低更新性能。在不瞭解原理的情況下亂用,可能會有1+N的問題。不當的使用還可能導致讀出髒數據。 如果受不了hibernate的諸多限制,那麼還是自己在應用程序的層面上做緩存吧。
在越高的層面上做緩存,效果就會越好。就好像儘管磁盤有緩存,數據庫還是要實現自己的緩存,儘管數據庫有緩存,咱們的應用程序還是要做緩存。因爲底層的緩存它並不知道高層要用這些數據幹什麼,只能做的比較通用,而高層可以有針對性的實現緩存,所以在更高的級別上做緩存,效果也要好些吧。

 

ps:http://www.ideagrace.com/html/doc/2008/01/08/08678.html

       http://tech.it168.com/j/d/2006-10-17/200610170921804.shtml

發佈了21 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章