JPA 緩衝,jpa緩衝

來源:互聯網
上載者:User

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語句、關閉更新資料表、變更記錄檔的輸出層級等。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.