JPA @Cache快取
阿新 • • 發佈:2019-01-06
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" />
當 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" />