我正在使用基于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文档中有足够的信息,以便通过以下代码将其作为spring缓存管理器进行介绍
@EnableCaching
...
...
@Bean
public CacheManager cacheManager() {
return new SpringCache2kCacheManager();
}最终目标是在需要时,但在调用以下方法时,在spring缓存层中重用现有的hibernate二级缓存
@Cacheable(cacheNames = "AdvertisingCategoryCache")
@Override
public AdvertisingCategory findById(Long id) {
// call to the repository
}我得到以下错误
Cache already created: 'AdvertisingCategoryCache'关键是我知道缓存已经创建好了。我需要的是重用现有的一个。
我该怎么做呢?
附注:这个示例非常简单,我可以直接删除@Cacheable方法,但我使用它是为了简单地解释我的情况。
发布于 2018-12-28 22:09:52
编辑:由于您没有使用Spring Boot,因此需要确保设置将缓存管理器与Hibernate链接的属性。
首先,您需要使用JCache,因此您必须替换您的自定义缓存配置才能使用JCache (Hibernate没有为cache2k提供缓存抽象实现)。
您应该有某种自定义的JPA设置来配置EntityManagerFactory。在该设置中,确保注入您创建的CacheManager。如果您有一个注入点,上下文将确保在尝试配置Hibernate之前完全解析CacheManager (这绝对是您在这里想要的)。
完成后,添加以下Hibernate属性:
hibernateProperties.put(ConfigSettings.CACHE_MANAGER, cacheManager.getCacheManager());其中cacheManager是JCacheCacheManager (包装本机javax.cache.CacheManager的Spring实现)。
如果使用Spring Boot,事情会更简单。首先,您应该确保让Spring Boot配置缓存管理器,而不是自己配置。既然您使用的是Hibernate的JCache,那么就在Spring Boot中使用相同的机制,因为它无论如何都是完全透明的(我们将在幕后将JCache CacheManager包装在正确的抽象中)。
如果这样做,Spring Boot将确保在hibernate启动之前引导JCache缓存管理器。还有一份专门的操作指南,解释了how to configure the integration between the two。
一旦你这样做了,相同的缓存管理器将被共享。
https://stackoverflow.com/questions/53933023
复制相似问题