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

Я работаю с приложением на основе Spring (не с Spring boot) и пытаюсь представить cache2k в качестве менеджера кеша 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 достаточно информации, чтобы представить его в качестве диспетчера пружинного кэша также со следующим кодом

@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 Ответ

0 голосов
/ 28 декабря 2018

Редактировать: поскольку вы не используете 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 перед запуском hibernate.Также есть специальная инструкция, объясняющая , как настроить интеграцию между двумя .

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

...