1

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

想法?

4

3 回答 3

1
<shared-cache-mode>

不是持久化单元属性,而是persistence.xml 中的一个元素。我不确定将“ javax.persistence.sharedCache.mode”设置为属性的作用,但我猜它只是设置为持久性单元属性,而被忽略。

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

如果您没有看到正在使用缓存,则可能是由于 Spring 错误,https://jira.springsource.org/browse/SPR-7753,在这种情况下,使用EclipseLinkJpaDialectsetLazyDatabaseTransaction()中的选项可以解决问题。

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

于 2013-03-21T13:45:23.053 回答
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();
}
于 2014-10-21T13:39:36.740 回答
0

我发现这篇文章非常有用。
结论写作,

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

于 2015-03-15T12:16:50.823 回答