JPA 緩衝,jpa緩衝
JPA 緩衝
對於JPA2.0,緩衝分為一級緩衝和二級緩衝(JPA1.0隻支援一級緩衝)。二級緩衝通常是用來提高應用程式效能的,它可以避免訪問以已經從資料庫載入的資料,提高訪問未被修改資料對象的速度。
持久化上下文就是JPA的一級緩衝,通過在持久化上下文中儲存持久化狀態實體的快照,既可以進行髒檢測,還可以當做持久化實體的緩衝。一級緩衝屬於請求範圍層級的緩衝,如下
JPA二級緩衝是跨越持久化內容相關的,是真正意義上的全域應用緩衝,如下
如果二級緩衝啟用,JPA會先從一級緩衝中尋找實體,未找到再從二級緩衝中尋找。當二級緩衝有效時,就不能依靠事務來保護並發的資料,而是依靠鎖策略,如在確認修改後,需要手工處理樂觀鎖失敗等。
注意:二級緩衝只能緩衝通過EntityManager的find或getReference查詢到的實體,以及通過實體的getter方法擷取到的關聯實體;而不能緩衝通過JPQL查詢獲得的資料。
二級緩衝通常用來提高效能,同時,使用二級緩衝可能會導致提取到“陳舊”資料,也會出現並發寫的問題。所以二級緩衝最好是用在經常閱讀資料,比較少更新資料的情況,而不應該對重要資料使用二級緩衝。
對於不同的JPA實現產品,開啟二級緩衝的方式會有所不同,下面以 Spring+Hibernate為例,開啟二級緩衝,步驟如下
1) 添加hibernate-ehcache.jar檔案,推薦使用maven來管理;
2) 修改Spring設定檔,開啟二級緩衝
3) 將需要緩衝的實體類標註@ javax.persistence.Cacheable或org.hibernate.annotations.Cache。
1、@Cacheable配置
採用@javax.persistence.Cacheable配置,開啟二級緩衝如下
<!--jpa-->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml"/>
<property name="persistenceUnitName" value="template"/>
<property name="packagesToScan" value="org.ssl.template.model"/>
<!---指定JPA適配器-->
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="true" />
<property name="generateDdl" value="true"/>
</bean>
</property>
<propertyname="jpaProperties">
<props>
<propkey="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
<!--設定sharedCache.mode為ENABLE_SELECTIVE時,在實體上添加@Cacheable就可以被緩衝-->
<prop key="javax.persistence.sharedCache.mode">ENABLE_SELECTIVE</prop>
<!--輸出統計資訊,在部署時需要關閉-->
<prop key="hibernate.generate_statistics">true</prop>
</props>
</property>
</bean>
注意:
u 實體上標註@cacheable時,需要設定javax.persistence.sharedCache.mode屬性值;
u javax.persistence.sharedCache.mode
值可以為ENABLE_SELECTIVE(推薦值)、DISABLE_SELECTIVE、NONE、ALL;
若為ENABLE_SELECTIVE,則只要添加@Cacheable註解的實體才會被緩衝;
若為DISABLE_SELECTIVE,則標註@Cacheable(value=false)的實體才被緩衝;
若為NONE,任何實體都不會被緩衝,即使被@Cacheable標註;
若為ALL,實體都會被緩衝,即使沒有@Cacheable標註;
u 開啟Hibernate的查詢快取
除了設定
key="hibernate.cache.use_query_cache">true</prop>
外,還需要在JPA查詢時採用@QueryHint來實現查詢快取,如下
public interface DictDao
{
// 通過@QueryHint來實現查詢快取。
@QueryHints({@QueryHint(name = "org.hibernate.cacheable", value ="true")})
List<Dict>findAll();
}
2、@Cache配置
採用org.hibernate.annotation.Cache配置時,設定如下:
<!--jpa-->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml"/>
<property name="persistenceUnitName" value="template"/>
<property name="packagesToScan" value="org.ssl.template.model"/>
<!---指定JPA適配器-->
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="true" />
<property name="generateDdl" value="true"/>
</bean>
</property>
<propertyname="jpaProperties">
<props>
<propkey="hibernate.cache.use_second_level_cache">true</prop>
<propkey="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
<!--輸出統計資訊,在部署時需要關閉-->
<prop key="hibernate.generate_statistics">true</prop>
</props>
</property>
</bean>
採用@cache時,除了在實體上標註@Cache外,還需要添加ehcache.xml設定檔,如下
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd">
<defaultCache
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="180"
overflowToDisk="false"
memoryStoreEvictionPolicy="LRU"
/>
<cache name="org.hibernate.cache.internal.StandardQueryCache"
maxElementsInMemory="100"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="180"
overflowToDisk="true" />
<cache name="org.hibernate.cache.spi.UpdateTimestampsCache"
maxElementsInMemory="100"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="180"
overflowToDisk="false" />
<!--單個實體的緩衝設定,不設定採用預設設定-->
<!--
<cachename="org.ssl.template.model.Template"
maxElementsInMemory="100"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="180"
overflowToDisk="false"
memoryStoreEvictionPolicy="LRU"
/>
-->
</ehcache>
注意:
u Hibernate3.x與Hibernate4.x開啟二級緩衝設定不同
Hibernate4.x:
<propkey="hibernate.cache.region.factory_class">
org.hibernate.cache.ehcache.EhCacheRegionFactory
</prop>
Hibernate3.x:
<prop key="hibernate.cache.provider_class ">
org.hibernate.cache.EhCacheProvider
</prop>
u 在部署項目時,需要將調試資訊關閉,如關閉顯示sql語句、關閉更新資料表、變更記錄檔的輸出層級等。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。