JPA 2.0 <shared-cache-mode>与javax.persistence.sharedCache.mode </shared-cache-mode>

时间:2013-03-20 18:41:07

标签: spring jpa eclipselink spring-orm shared-cache

使用Spring 3.2.0,Eclipselink 2.5.0-M9

当persistence.xml包含:

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

然后,如果我在运行时通过emf.getProperties()检查EntityManagerFactory,则不会设置此属性。

但是,如果我把它放在我的Spring 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配置时,实际上并未启用共享缓存。这让我相信我没有在弹簧容器中正确设置它。

想法?

3 个答案:

答案 0 :(得分:1)

<shared-cache-mode>

不是持久性单元属性,而是persistence.xml中的元素。我不确定作为属性的“javax.persistence.sharedCache.mode”设置是什么,但我的猜测是它被设置为持久性单元属性,并被忽略。

但默认情况下,EclipseLink启用共享缓存,因此您无需对其进行配置。

如果你没有看到使用缓存,可能是因为Spring bug https://jira.springsource.org/browse/SPR-7753,在这种情况下,在 EclipseLinkJpaDialect setLazyDatabaseTransaction()选项有一种解决方法>

ENABLE_SELECTIVE 我认为仅对具有@Cacheable(true)的实体启用缓存,因此可能不是您想要的。

答案 1 :(得分:0)

我发现这个解决方法是在Spring环境中的EclipseLink中启用共享缓存:

@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();
}

答案 2 :(得分:0)

我发现this article非常有用 结论正在撰写,

  

JPA缓存足够灵活,可以在持久性单元设置或类设置的帮助下,按类或全局配置。我们可以在persistence.xml中设置shared-cache-mode元素,也可以在创建实体管理器工厂时动态设置javax.persistence.sharedCache.mode属性。在并发事务中,考虑到更好的性能,将缓存模式设置为NONE可能反而导致性能下降,不建议使用;这种情况应该用适当的锁定机制来处理。