2013-03-20 107 views
1

使用Spring 3.2.0,2.5.0的EclipseLink-M9JPA 2.0 <共享高速緩存模式>與javax.persistence.sharedCache.mode

當persistence.xml中包含:

<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode> 

然後,如果我在運行時通過emf.getProperties()檢查EntityManagerFactory,則不會設置此屬性。

但是,如果我把它放在我的entityManagerFactory春代替配置:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    ... 
    <property name="jpaPropertyMap"> 
    <map> 
     <entry key="javax.persistence.sharedCache.mode" value="ENABLE_SELECTIVE" /> 
    </map> 
    </property> 
</bean> 

然後我就可以檢索emf.getProperties()

而且屬性,看來使用Spring配置時,共享緩存實際上並未啓用。這導致我相信我沒有在彈簧容器中正確設置它。

想法?

回答

1
<shared-cache-mode> 

是不是持久單元屬性,但在persistence.xml的元件。我不知道設置「javax.persistence.sharedCache.mode」作爲屬性的設置,但我的猜測是它只是設置爲持久性單元屬性,並被忽略。

但默認情況下,EclipseLink啓用共享緩存,因此您無需對其進行配置。

如果您沒有看到正在使用的緩存,這可能是因爲春節的bug,https://jira.springsource.org/browse/SPR-7753,在這種情況下有使用在EclipseLinkJpaDialectsetLazyDatabaseTransaction()選擇一種解決方法。

ENABLE_SELECTIVE我認爲意味着只啓用緩存的實體有@Cacheable(true),以便可能不是你想要的。

+0

謝謝,詹姆斯。 re:這個屬性,http://docs.oracle.com/javaee/6/tutorial/doc/gkjjj.html表明元素或屬性應該具有相同的行爲。 – 2013-03-21 15:47:02

0

我發現這個解決辦法,使中的EclipseLink在Spring環境中共享緩存:

@Bean 
public EntityManagerFactory entityManagerFactory() { 
    LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); 
    factory.setDataSource(dataSource()); 
    factory.setPersistenceUnitName("main"); 

    final EclipseLinkJpaDialect customDialect = new EclipseLinkJpaDialect() { 
     @Override 
     public ConnectionHandle getJdbcConnection(EntityManager entityManager, boolean readOnly) throws PersistenceException, SQLException { 
      // Hides: return super.getJdbcConnection(entityManager, readOnly); 
      // IMPORTANT LINE 
      return null; 
     } 
    }; 

    // IMPORTANT LINE 
    customDialect.setLazyDatabaseTransaction(true); 

    EclipseLinkJpaVendorAdapter customAdapter = new EclipseLinkJpaVendorAdapter() { 
     @Override 
     public JpaDialect getJpaDialect() { 
      return customDialect; 
     } 
    }; 

    customAdapter.setDatabase(Database.ORACLE); 
    factory.setJpaVendorAdapter(customAdapter); 

    factory.afterPropertiesSet(); 
    return factory.getObject(); 
} 
0

我發現this article非常有用的。
結論是寫作,

JPA緩存足夠靈活,每類的基礎上或與全球的持久性單元設置或類設置的幫助來配置。我們可以在persistence.xml中設置shared-cache-mode元素,或者在創建實體管理器工廠時動態設置javax.persistence.sharedCache.mode屬性。在併發事務中,爲了提高性能而將緩存模式設置爲NONE可能會導致性能下降,因此不推薦使用;這種情況應該用適當的鎖定機制來處理。