Caching 是否可以将Cache2k用作hibernate二级缓存和spring缓存管理器?
我正在使用基于spring的应用程序(而不是spring boot),并尝试将cache2k引入spring缓存管理器 目前,通过设置以下属性,cache2k被用作Hibernate二级缓存Caching 是否可以将Cache2k用作hibernate二级缓存和spring缓存管理器?,caching,spring-cache,cache2k,Caching,Spring Cache,Cache2k,我正在使用基于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.
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配置文件(仅与示例相关的部分)
最终目标是在需要时,但调用以下方法时,在spring缓存层中重用现有的hibernate二级缓存
@Cacheable(cacheNames = "AdvertisingCategoryCache")
@Override
public AdvertisingCategory findById(Long id) {
// call to the repository
}
我得到以下错误
Cache already created: 'AdvertisingCategoryCache'
关键是我知道缓存已经创建。我的需要是重用现有的一个
我该怎么做
另外,这个例子非常简单,我可以直接删除@Cacheable方法,但我使用它来简单地解释我的情况。编辑:因为您没有使用Spring Boot,所以需要确保设置将缓存管理器与Hibernate链接的属性 首先,您需要使用JCache,因此必须替换自定义缓存配置以使用JCache(Hibernate没有为cache2k提供缓存抽象实现) 您应该有某种自定义JPA设置,用于配置
EntityManagerFactory
。在该设置中,确保插入您创建的CacheManager
。如果您有一个注入点,那么上下文将确保在尝试配置Hibernate之前完全解析CacheManager
(这绝对是您想要的)
完成此操作后,添加以下Hibernate属性:
hibernateProperties.put(ConfigSettings.CACHE_MANAGER, cacheManager.getCacheManager());
其中cacheManager
是JCacheCacheManager
(Spring实现包装了本机javax.cache.cacheManager
)
如果您使用Spring Boot,事情会变得更简单。首先,您应该确保让Spring引导配置缓存管理器,而不是自己配置。由于您使用的是用于Hibernate的JCache,所以只需在Spring Boot中使用相同的机制,因为它是完全透明的(我们将把JCacheCacheManager
封装在正确的抽象中)
如果这样做,SpringBoot将确保在hibernate启动之前启动JCache缓存管理器。还有一个明确的操作说明
完成此操作后,将共享同一个缓存管理器。您好,Stephane,谢谢您的回答。这正是我需要的,但你的答案是指一个Spring Boot应用程序,但正如前面所说,不幸的是,我的不是Spring Boot应用程序。对不起,我错过了。然后,您需要在自定义JPA设置中执行我已经指出的操作。尤其要确保删除其中的最后两个属性,以便Hibernate不会试图自行查找缓存基础结构。我用非Spring引导建议编辑了我的答案
Cache already created: 'AdvertisingCategoryCache'
hibernateProperties.put(ConfigSettings.CACHE_MANAGER, cacheManager.getCacheManager());