2013-03-20 104 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可能会导致性能下降,因此不推荐使用;这种情况应该用适当的锁定机制来处理。