什麼是緩存(我的理解):在內存中開闢一塊空間,把原來在硬盤上的東西,放到內存當中,當需要用到一些數據時,直接在內存中查找,而不是到硬盤上查找。這塊內存中的空間就是緩存。緩存能提高程序的運行效率。
一級緩存(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>
然後加上:setCachable(true)
緩存算法有:
LRU(Least Recently Used):這種算法是在每個對象中維護一個訪問的時間變量,每次訪問後,時間都會更新,當新的對象需要存放到緩存時,替換那個按時間排序最後的對象。
LFU(Least Frequently Used):這種算法是每個對象記錄了對象訪問的次數(即命中率),當新的對象需要存放到緩存時,替換那個訪問次數最少的對象。
FIFO(First In First Out):這種算法是將緩存中的對象存放成一個數組,當新的對象需要存放到內存中是,替換最先存放到緩存的對象。
使用時通常在緩存配置文件中加入:MemoryStoreEvictionPolicy="LRU"