Можно ли использовать Cache2k в качестве спящего кеша второго уровня, а также в качестве менеджера кеша Spring?

Я работаю с приложением на основе Spring (не Spring Boot), и я пытаюсь представить cache2k в качестве менеджера Spring Spring.

В настоящее время cache2k используется в качестве кэша второго уровня Hibernate, устанавливая следующие свойства

hibernate.cache.use_second_level_cache = true
hibernate.cache.region.factory_class = org.hibernate.cache.jcache.JCacheRegionFactory
hibernate.javax.cache.provider = org.cache2k.jcache.provider.JCacheProvider

со следующим файлом конфигурации cache2k.xml (только соответствующая часть, связанная с примером)

<cache2k xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
     xmlns='https://cache2k.org/schema/v1.x'
     xsi:schemaLocation="https://cache2k.org/schema/v1.x https://cache2k.org/schema/cache2k-core-v1.x.xsd">
<!-- The configuration example for the documentation -->
<version>1.0</version>

<skipCheckOnStartup>true</skipCheckOnStartup>
<ignoreMissingCacheConfiguration>true</ignoreMissingCacheConfiguration>

<defaults>
    <cache>
        <entryCapacity>100</entryCapacity>
    </cache>
</defaults>

<templates>
    <cache>
        <name>lookupTable</name>
        <expireAfterWrite>1d</expireAfterWrite>
        <entryCapacity>50_000</entryCapacity>
    </cache>
</templates>

<caches>

    <cache>
        <name>AdvertisingCategoryCache</name>
        <include>lookupTable</include>
    </cache>

</caches>

Теперь я хочу представить менеджер кеша Spring, и в документации к cache2k достаточно информации, чтобы представить его как менеджер кеша Spring со следующим кодом

@EnableCaching
...
...

@Bean
public CacheManager cacheManager() {
    return new SpringCache2kCacheManager();
}

Конечная цель состоит в том, чтобы повторно использовать существующий кэш второго уровня в спящем режиме также в весеннем кеширующем слое, когда это необходимо, но при вызове следующего метода.

@Cacheable(cacheNames = "AdvertisingCategoryCache")
@Override
public AdvertisingCategory findById(Long id) {
    // call to the repository
}

Я получаю следующую ошибку

Cache already created: 'AdvertisingCategoryCache'

Дело в том, что я знаю, что кеш уже создан. Мне нужно повторно использовать существующий.

Как я могу это сделать?

PS Пример очень прост, и я точно могу удалить метод @Cacheable, но я использовал его, чтобы дать простое объяснение моей ситуации.

1 ответ

Изменить: так как вы не используете Spring Boot, вам необходимо убедиться, что вы установили свойство, которое связывает менеджер кэша с Hibernate.

Прежде всего вам нужно использовать JCache, поэтому вам придется заменить свою настраиваемую конфигурацию кеша на использование JCache (Hibernate не обеспечивает реализацию абстракции кеша для cache2k).

У вас должна быть какая-то пользовательская настройка JPA, которая настраивает EntityManagerFactory, В этой настройке убедитесь, что CacheManager что вы создали. Если у вас есть точка внедрения, контекст полностью разрешит CacheManager прежде чем пытаться настроить Hibernate (что, безусловно, то, что вы хотите здесь).

После этого добавьте следующее свойство Hibernate:

hibernateProperties.put(ConfigSettings.CACHE_MANAGER, cacheManager.getCacheManager());

куда cacheManager это JCacheCacheManager (реализация Spring оборачивает нативный javax.cache.CacheManager).

Все проще, если вы используете Spring Boot. Прежде всего, вы должны убедиться, что Spring Boot настроил менеджер кеша, а не делал это самостоятельно. Поскольку вы используете JCache для Hibernate, просто используйте тот же механизм в Spring Boot, поскольку он в любом случае полностью прозрачен (мы завернем JCache CacheManager в правильной абстракции за кадром).

Если вы сделаете это, Spring Boot обязательно улучшит менеджер кэша JCache перед запуском спящего режима. Существует также специальная инструкция, объясняющая, как настроить интеграцию между ними.

После того, как вы это сделаете, тот же менеджер кэша будет доступен.

Другие вопросы по тегам