使用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配置时,实际上并未启用共享缓存。这让我相信我没有在弹簧容器中正确设置它。
想法?
答案 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可能反而导致性能下降,不建议使用;这种情况应该用适当的锁定机制来处理。