JPA 2.0 <режим совместного использования кэша> против javax.persistence.sharedCache.mode
Использование Spring 3.2.0, Eclipselink 2.5.0-M9
Когда файл persistence.xml содержит:
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
Затем, если я проверю EntityManagerFactory во время выполнения, через emf.getProperties(), это свойство не устанавливается.
Тем не менее, если я добавлю его в конфигурацию 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 ()
Кроме того, похоже, что при использовании конфигурации весны общий кэш фактически не включен. это наводит меня на мысль, что я неправильно устанавливаю его в контейнере пружины.
Идеи?
3 ответа
<shared-cache-mode>
Не является свойством единицы постоянства, но является элементом в файле persistence.xml. Я не уверен, что настройка "javax.persistence.sharedCache.mode
msgstr "как свойство, но я предполагаю, что оно просто устанавливается как свойство единицы персистентности и игнорируется.
Но по умолчанию EclipseLink включает общий кеш, поэтому вам не нужно его настраивать.
Если вы не видите, что используется кэширование, это может быть связано с ошибкой Spring, https://jira.springsource.org/browse/SPR-7753, и в этом случае существует обходной путь, использующий setLazyDatabaseTransaction()
опция в EclipseLinkJpaDialect.
ENABLE_SELECTIVE Я думаю, что означает включить только кэширование для объектов, которые имеют @Cacheable(true)
, так что это может быть не то, что вы хотите.
Я нашел эту статью очень полезной.
Вывод пишу,
Кэширование JPA достаточно гибко, чтобы его можно было настроить для каждого класса или глобально с помощью настроек модуля персистентности или настроек класса. Мы можем либо установить элемент shared-cache-mode в persistence.xml, либо динамически установить свойство javax.persistence.sharedCache.mode при создании фабрики диспетчера сущностей. В параллельных транзакциях установка режима кэширования на NONE ввиду лучшей производительности, напротив, может привести к снижению производительности и не рекомендуется; С такими ситуациями лучше обращаться с соответствующим механизмом блокировки.
Я нашел этот обходной путь для включения общего кэша в EclipseLink в среде Spring:
@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();
}