首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以将Cache2k用作hibernate二级缓存和spring缓存管理器吗?

可以将Cache2k用作hibernate二级缓存和spring缓存管理器吗?
EN

Stack Overflow用户
提问于 2018-12-26 21:53:09
回答 1查看 263关注 0票数 2

我正在使用基于spring的应用程序(而不是spring boot),并试图引入cache2k作为spring缓存管理器。

目前,通过设置以下属性,将cache2k用作Hibernate二级缓存

代码语言:javascript
复制
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配置文件(仅与示例相关的部分)

代码语言:javascript
复制
<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缓存管理器进行介绍

代码语言:javascript
复制
@EnableCaching
...
...

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

最终目标是在需要时,但在调用以下方法时,在spring缓存层中重用现有的hibernate二级缓存

代码语言:javascript
复制
@Cacheable(cacheNames = "AdvertisingCategoryCache")
@Override
public AdvertisingCategory findById(Long id) {
    // call to the repository
}

我得到以下错误

代码语言:javascript
复制
Cache already created: 'AdvertisingCategoryCache'

关键是我知道缓存已经创建好了。我需要的是重用现有的一个。

我该怎么做呢?

附注:这个示例非常简单,我可以直接删除@Cacheable方法,但我使用它是为了简单地解释我的情况。

EN

回答 1

Stack Overflow用户

发布于 2018-12-28 22:09:52

编辑:由于您没有使用Spring Boot,因此需要确保设置将缓存管理器与Hibernate链接的属性。

首先,您需要使用JCache,因此您必须替换您的自定义缓存配置才能使用JCache (Hibernate没有为cache2k提供缓存抽象实现)。

您应该有某种自定义的JPA设置来配置EntityManagerFactory。在该设置中,确保注入您创建的CacheManager。如果您有一个注入点,上下文将确保在尝试配置Hibernate之前完全解析CacheManager (这绝对是您在这里想要的)。

完成后,添加以下Hibernate属性:

代码语言:javascript
复制
hibernateProperties.put(ConfigSettings.CACHE_MANAGER, cacheManager.getCacheManager());

其中cacheManagerJCacheCacheManager (包装本机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

一旦你这样做了,相同的缓存管理器将被共享。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53933023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档