hibernate一級緩存,二級緩存,三級緩存,緩存算法及配置。

什麼是緩存(我的理解):在內存中開闢一塊空間,把原來在硬盤上的東西,放到內存當中,當需要用到一些數據時,直接在內存中查找,而不是到硬盤上查找。這塊內存中的空間就是緩存。緩存能提高程序的運行效率。

一級緩存(session級的緩存):在一個session中load同一個對象2次,load時,hibernate首先在session緩存中查找對象,如果沒找到就到數據庫中去load。因此,在同一個session中load一個對象2次,只會發出一條sql語句。而在2個session中load同一個對象則會發送2次sql語句。

二級緩存(session的公用緩存,sessionFactory級別的緩存,jvm級緩存):hibernate支持多種二級緩存,hibernate提供了一個HashTable,用於測試,不建議運用與產品中。

Hibernate支持的jvm級的緩存有如下:

org.hibernate.cache.HashtableCacheProvider(hibernate自帶的用於測試的2級緩存。)

org.hibernate.cache.EhCacheProvider

org.hibernate.cache.OSCacheProvider

org.hibernate.cache.SwarmCacheProvider

org.hibernate.cache.TreeCacheProvider

在hibernate的配置文件中打開二級緩存如下:

        <!--

                                    打開並配置二級緩存

        -->

        <property name="cache.use_second_level_cache">true</property>

 

 <property name="cache.provider_class">org.hibernate.cache.EhCacheProvider

</property>

二級緩存適合放什麼對象呢?

經常被訪問(這個對象經常被訪問,如果每次都到數據庫去取,會降低效率)

改動不大(這個對象改動不大,如果改動較大,就可能造成緩存數據跟數據庫中的數據不一致)

在hibernate3.5.4中,這樣的配置會出現一個問題。就是加上打開緩存的2句話,   

sf=new AnnotationConfiguration().configure().buildSessionFactory();無法成功執行。問題還未解決。用hibernate自帶的org.hibernate.cache.HashtableCacheProvider則可以正常執行。
 

 

③數量有限(如果這個類的對象太多,緩存就會很大。)

三級緩存(查詢緩存):如果要使Query使用二級緩存,則需要打開查詢緩存。事實上,三級緩存是基於二級緩存的,如:list(集合),默認情況,它只會往二級緩存中存放數據,查找時不會搜索二級緩存,這是因爲查詢條件會隨時變化。有一種情況就是2次查詢的條件是一樣的,這是要想使用二級緩存,就必須打開查詢緩存,打開方式如:

<property name="cache.use_query_cache">true</property>

然後加上:setCachabletrue

緩存算法有:

LRU(Least Recently Used):這種算法是在每個對象中維護一個訪問的時間變量,每次訪問後,時間都會更新,當新的對象需要存放到緩存時,替換那個按時間排序最後的對象。

LFU(Least Frequently Used):這種算法是每個對象記錄了對象訪問的次數(即命中率),當新的對象需要存放到緩存時,替換那個訪問次數最少的對象。

FIFO(First In First Out):這種算法是將緩存中的對象存放成一個數組,當新的對象需要存放到內存中是,替換最先存放到緩存的對象。

使用時通常在緩存配置文件中加入:MemoryStoreEvictionPolicy="LRU"

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章