Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring jpa2.0<;共享缓存模式>;vs.javax.persistence.sharedCache.mode_Spring_Jpa_Eclipselink_Spring Orm_Shared Cache - Fatal编程技术网

Spring jpa2.0<;共享缓存模式>;vs.javax.persistence.sharedCache.mode

Spring jpa2.0<;共享缓存模式>;vs.javax.persistence.sharedCache.mode,spring,jpa,eclipselink,spring-orm,shared-cache,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> 启用\u选择性 然后,如果在运行时通过emf.getProperties()检查EntityManagerFactory,则不会设置此属性 但是,如果我将其放在Spring entityManagerFactory配置中: <bea

使用Spring 3.2.0,Eclipselink 2.5.0-M9

当persistence.xml包含以下内容时:

<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
启用\u选择性
然后,如果在运行时通过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配置时,共享缓存似乎并未实际启用。这让我相信我没有在spring容器中正确设置它

想法?


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

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

如果您没有看到正在使用缓存,可能是因为Spring错误,在这种情况下,可以使用EclipseLinekJPadialECT中的
setLazyDatabaseTransaction()
选项解决问题

启用\u选择性的我认为这意味着只为具有
@Cacheable(true)
的实体启用缓存,因此这可能不是您想要的。


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

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

如果您没有看到正在使用缓存,可能是因为Spring错误,在这种情况下,可以使用EclipseLinekJPadialECT中的
setLazyDatabaseTransaction()
选项解决问题


启用\u SELECTIVE我想我的意思是只为具有
@Cacheable(true)
的实体启用缓存,所以这可能不是您想要的。

我发现了在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();
}

我在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();
}
我发现非常有用。
结论是写作

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

我发现非常有用。
结论是写作

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


谢谢,詹姆斯。re:property,表示元素或属性应该具有相同的行为。谢谢,James。re:属性,表示元素或属性应具有等效的行为。