1. 程式人生 > >JPA @Cache快取

JPA @Cache快取

Hibernate 的一級快取是由 Session 提供的,因此它只存在於 Session 的生命週期中,當程式呼叫 save(),update(),saveorupdate() 等方法 及呼叫查詢介面 list,filter,iterate 時,如 session 快取中還不存在相應的物件, Hibernate 會把該物件加入到一級快取中, 
當 Session 關閉的時候該 Session 所管理的一級快取也會立即被清除 
Hibernate 的一級快取是 Session 所內建的,不能被解除安裝,也不能進行任何配置 
  
二級快取配置:     
   
1 、首先要開啟二級快取,在 hibernate.cfg.xml 中新增如下配置:     
<property name="hibernate.cache.use_second_level_cache">true</property>   
   
2 、 Hibernate 的二級快取使用第三方的快取工具來實現,所以我們需要指定 Hibernate 使用哪個     
   快取工具。如下配置指定 Hibernate 使用 EhCache 快取工具。     
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>   
   
3 、 Hibernate 在預設情況下並不會對所有實體物件進行快取,所以,我們需要指定快取哪些物件,     
在實體物件的對映檔案中(相應的 <class> 標籤內部),新增如下配置:     
<cache usage="read-only"/>   
   
usage="read-only" 是“只讀”快取策略。     
   
注意,這個 <cache> 標籤只能放在 <class> 標籤的內部,而且必須處在 <id> 標籤的前面!!!     
這個 <cache> 標籤放在哪些 <class> 標籤下面,就說明會多這些類的物件進行快取     
   
4 、對於第 3 步,有一個可選的方案是在 hibernate.cfg.xml 檔案中指定哪些類的物件需要快取,     
   而不需要使用 <cache> 標籤來指定。如:     
   在 hibernate.cfg.xml 中新增如下配置:     
   <class-cache class="com.bjsxt.hibernate.Classes" usage="read-only" />   
      
   注意,這個 <class-cache> 標籤必須放在 <mapping> 標籤的後面!!     
  
Hibernate快取配置 
_____________________________________________________________________________________ 
Hibernate的快取分為: 
  一級快取:在Session級別的,在Session關閉的時候,一級快取就失效了。 
  二級快取:在SessionFactory級別的,它可以使用不同的快取實現,如EhCache 、JBossCache、OsCache等。 
   
快取的註釋寫法如下,加在Entity的java類上: 
  @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
   
快取的方式有四種,分別為: 
  CacheConcurrencyStrategy.NONE 
  CacheConcurrencyStrategy.READ_ONLY,只讀模式,在此模式下,如果對資料進行更新操作,會有異常; 
  CacheConcurrencyStrategy.READ_WRITE,讀寫模式在更新快取的時候會把快取裡面的資料換成一個鎖,其它事務如果去取相應的快取資料,發現被鎖了,直接就去資料庫查詢; 
  CacheConcurrencyStrategy.NONSTRICT_READ_WRITE,不嚴格的讀寫模式則不會的快取資料加鎖; 
  CacheConcurrencyStrategy.TRANSACTIONAL,事務模式指快取支援事務,當事務回滾時,快取也能回滾,只支援JTA環境。 
   
另外還有如下注意事項: 
  1、查詢快取需要在Query的相應方法執行前加上這麼一句: 
  query.setCacheable(true); 
  在使用Hibernate時,獲得的query有setCacheable 方法,可以設定使用快取,但當使用JPA時,javax.persistence.Query並沒有setCacheable方法,此時如果JPA的實現是Hibernate時,可以將其進行如下轉化,再呼叫setCacheable方法(如果JPA的實現是其它ORMAP框架,就不知道怎麼做了)。 
if (query instanceof org.hibernate.ejb.QueryImpl) {
    ((org.hibernate.ejb.QueryImpl) query).getHibernateQuery().setCacheable(true);

  2、還有就是查詢快取的查詢執行後,會將查詢結果放入二級快取中,但是放入的形式是以ID為Key,例項作為一個Value。 
  3、hibernate的配置檔案中需加入如下資訊: 
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider" />
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.use_query_cache" value="true" />