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.modemsgstr "как свойство, но я предполагаю, что оно просто устанавливается как свойство единицы персистентности и игнорируется.

Но по умолчанию 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();
}
Другие вопросы по тегам