当前位置: 首页 > 知识库问答 >
问题:

SelfPopulatingCache现有缓存问题(Spring 4, EhCache 2.10.3)

段干长恨
2023-03-14

我有一个项目设置(这里的片段来自我在GitHub https://GitHub . com/ashishmarwal/self-populating-cache-issue上创建的一个演示项目),其中在ehcache配置(ehcache.xml)中声明了一个原始的eh-cache缓存。

<cache name="alphabet-description-cache"
       eternal="false"
       maxElementsInMemory="1000"
       memoryStoreEvictionPolicy="LRU"
       overflowToDisk="false"
       timeToLiveSeconds="300"
       timeToIdleSeconds="300" />

然后,Spring bean描述符使用该原始缓存使用CacheEntry Works创建修饰的(SelfPopulatingCache):

<bean id="springCacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
    <property name="cacheManager" ref="cacheManager"/>
</bean>

<!--Creating a decorated cache instance using the raw cache cinfigured in ehcache.xml -->
<bean id="alphabetDescriptionCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
    <property name="cacheManager" ref="cacheManager"/>
    <property name="cacheName" value="alphabet-description-cache"/>
    <property name="cacheEntryFactory" ref="alphabetDescriptionCacheEntryFactory"/>
</bean>

<bean id="alphabetDescriptionCacheEntryFactory" class="com.marwals.ashish.issues.selfpopulatingcache.AlphabetDescriptionCacheEntryFactory" />

我们还有一个测试上下文。xml,用于单元测试并声明cacheManager以及修饰的缓存(在我看来,我给这些缓存管理器赋予了不同的名称):

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
    <property name="cacheManagerName" value="self-populating-cache-issue-demo-test"/>
    <property name="shared" value="true"/>
    <property name="acceptExisting" value="false"/>
    <property name="configLocation" value="classpath:/ehcache.xml"/>
</bean>

<bean id="springCacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
    <property name="cacheManager" ref="cacheManager"/>
</bean>

<bean id="alphabetDescriptionCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
    <property name="cacheManager" ref="cacheManager"/>
    <property name="cacheName" value="alphabet-description-cache"/>
    <property name="cacheEntryFactory" ref="alphabetDescriptionCacheEntryFactory"/>
</bean>

<bean id="alphabetDescriptionCacheEntryFactory" class="com.marwals.ashish.issues.selfpopulatingcache.AlphabetDescriptionCacheEntryFactory" />

这里的问题是,如果我有两个不同的测试,每个都加载主bean描述符或测试上下文bean描述符,我会遇到一个现有的缓存问题:

    Error creating bean with name 'alphabetDescriptionCache' defined in class path resource [test-context.xml]: Invocation of init method failed; 
nested exception is net.sf.ehcache.CacheException: Cannot replace alphabet-description-cache It does not equal the incumbent cache.

有什么想法吗?调试代码显示,对于同一个原始缓存,我有两个不同的缓存实例,然后EhCache的缓存管理器将其作为错误引发。

我创建了一个git repo来演示这个问题:https://github.com/ashishmarwal/self-populating-cache-issue

谢谢!!!

共有1个答案

沈自珍
2023-03-14

您在Spring配置中明确请求了一个共享缓存管理器

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
    <property name="cacheManagerName" value="self-populating-cache-issue-demo"/>
    <property name="shared" value="true"/> <!-- here -->
    <property name="acceptExisting" value="false"/>
    <property name="configLocation" value="classpath:/ehcache.xml"/>
</bean>

这意味着Ehcache将始终为给定配置返回相同的CacheManager。在你的情况下(一般来说)你不希望这样。

只需将共享设置为 false 即可解决您的问题。

 类似资料:
  • 主要内容:缓存穿透,缓存击穿,缓存雪崩在实际的业务场景中,Redis 一般和其他数据库搭配使用,用来减轻后端数据库的压力,比如和关系型数据库 MySQL 配合使用。 Redis 会把 MySQL 中经常被查询的数据缓存起来,比如热点数据,这样当用户来访问的时候,就不需要到 MySQL 中去查询了,而是直接获取 Redis 中的缓存数据,从而降低了后端数据库的读取压力。如果说用户查询的数据 Redis 没有,此时用户的查询请求就会转到

  • 我是flutter应用程序开发的初学者。当我在模拟器上运行我的flutter默认项目代码时,我面临这个问题: 在调试模式下在IA仿真器上的AOSP上启动lib\main.dart...运行Gradle任务'assembleDebug'... 失败:生成失败,出现异常。 错误:无法打开设置文件“C:\Users\Administrator\StudioProjects\myapp\android\s

  • 主要内容:本节引言:,1.缓存的分类:,2.为WebView开启缓存功能,3.删除WebView的缓存数据,4.示例代码下载:,5.本节小结:本节引言: 现在很多门户类信息网站,比如虎嗅,ifanr,钛媒体等等的APP,简单点说是信息阅读类的APP,很多 都是直接嵌套一个WebView用来显示相关资讯的,这可能就涉及到了WebView的缓存了! 所谓的页面缓存 就是指:保存加载一个网页时所需的HTML,JS,CSS等页面相关的数据以及其他资源,当没网的时候或者 网络状态较差的时候,加载本地保存好

  • 我正在使用链接到S3桶的AWS云前线来托管静态(反应)网站。除了我将更改的文件上传到桶中之外,一切似乎都正常。我知道设计云前线会缓存文件,你必须使更改的文件无效,以便云前线尽快获取新的更改。然而,每当我浏览网站(在不同的设备上)时,我仍然会得到旧版本的文件。有时,我会看到网页的最新版本,但后来当我浏览到同一个页面时,它会得到旧版本(即使在清除缓存或隐姓埋名浏览之后)?!非常奇怪。 关于我的设置,我

  • 当我试图使用ebean缓存系统(带有io.ebean:ebean-redis)读取@ManyTomany关系时,我遇到了一个异常。这是一个springboot应用程序。 我正在使用的版本: SpringBootVersion=2.4.3 MariaDbVersion=2.7.2 EBeanVersion=12.7.2 Flywayversion=7.7.0 BaseModel Java类: 文章J

  • 我有一个使用assetic的Symfony2应用程序。一切都很好,只是在localhost中,浏览器不会缓存我的资产。 任何想法,为什么以下资产没有得到缓存响应304和毫秒,而是与200响应,需要大约15秒... 响应头 Accep-Ranges bytes Cache-Control max-age=604800 Connection Keve-Alive Content-Encode gzip