1. 程式人生 > >hibernate快取機制簡述

hibernate快取機制簡述

快取的作用主要用來提高效能,可以簡單地理解成一個Map。使用快取涉及到三個操作:把資料放入快取(put)、從快取中獲取資料(get)、刪除快取中的無效資料(remove)。

一級快取Session共享(生命週期很短,一般在一個Http請求內):

       saveupdatesaveOrUpdateloadgetlistiteratelock這些方法都會將物件放入一級快取中,一級快取不能控制快取的數量,所以要注意大批量操作資料時可能造成的記憶體溢位,可以用evict、clear方法清除快取中的內容。

二級快取SessionFactory共享:

l         實現為可插拔,通過修改cache.provider.class引數來改變。

Hibernate內建了對EhCache、OSCache、TreeCache、SwarmCache的支援,可以通過實現CacheProvider和Cache介面來加入Hibernate不支援的快取實現。

l         hibernate.cfg.xml中加入:

<property name=“cache.use_second_level_cache”>true</property>(預設為true

<property name=“cache.provider_class”>org.hibernate.cache.OSCacheProvider</property>

<class-cache class=“classname” usage=“read-only”/>

或在對映檔案的class元素中加入子元素:

<cache usage=“read-write”>

其中usage的取值範圍為:read-onlyread-writenonstrict-read-writetransactional

l         Session的save()方法(這個方法不適合native生成方式的主鍵)、update、saveOrUpdate、list、iterator、get、load以及Query、Criteria都會填充二級快取,但只有(沒有開啟查詢快取時

)Session的iterator、get、load會從二級快取中取資料(iterator可能存在N+1次查詢)。

l         Query、Criteria(查詢快取)由於命中率較低,所以Hibernate預設時關閉;修改cache.use_query_cache為true開啟對查詢的快取,並且呼叫query.setCacheable(true)criteria.setCacheable(true)

l         SessionFactory中提供了evictXXX()方法用來清除快取中的內容。

l         統計資訊開啟generate_statistics,用sessionFactory.getStatistics()來獲取統計資訊。

什麼樣的資料適合存放到第二級快取中?   
1 很少被修改的資料   
2 不是很重要的資料,允許出現偶爾併發的資料   
3 不會被併發訪問的資料   
4 常量資料   
不適合存放到第二級快取的資料?   
1經常被修改的資料   
2 .絕對不允許出現併發訪問的資料,如財務資料,絕對不允許出現併發   
3 與其他應用共享的資料。 


Hibernate查詢物件如何應用快取?
當Hibernate根據ID訪問資料物件的時候,首先從Session一級快取中查;查不到,如果配置了二級快取,那麼從二級快取中查;如果都查不到,再查詢資料庫,把結果按照ID放入到快取
刪除、更新、增加資料的時候,同時更新快取


Hibernate管理快取例項
無論何時,我們在管理Hibernate快取(Managing the caches)時,當你給save()、update()或saveOrUpdate()方法傳遞一個物件時,或使用load()、 get()、list()、iterate() 或scroll()方法獲得一個物件時, 該物件都將被加入到Session的內部快取中。 
當隨後flush()方法被呼叫時,物件的狀態會和資料庫取得同步。 如果你不希望此同步操作發生,或者你正處理大量物件、需要對有效管理記憶體時,你可以呼叫evict() 方法,從一級快取中去掉這些物件及其集