Spring jpa2.0<;共享缓存模式>;vs.javax.persistence.sharedCache.mode
使用Spring 3.2.0,Eclipselink 2.5.0-M9 当persistence.xml包含以下内容时: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
<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:属性,表示元素或属性应具有等效的行为。