You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot同时使用Caffeine与Simple缓存触发异常问题咨询

SpringBoot同时使用Caffeine与Simple缓存触发异常问题

作为SpringBoot新手,因业务需求需同时实现Caffeine缓存与Simple缓存。单独使用任意一种缓存时编译及运行均正常,但同时使用(无论同一类或不同类中)会触发异常,咨询是否可以同时使用这两种缓存机制。

异常信息

Oct 10, 2023 9:40:06 PM org.apache.catalina.loader.WebappClassLoaderBase clearReferencesThreads
WARNING: The web application [ROOT] appears to have started a thread named [cluster-ClusterId{value='6525775bd54ff65387d86e72', description='null'}-localhost:27017] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 java.net.SocketInputStream.socketRead0(Native Method)
 java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
 java.net.SocketInputStream.read(SocketInputStream.java:171)
 java.net.SocketInputStream.read(SocketInputStream.java:141)
 com.mongodb.internal.connection.SocketStream.read(SocketStream.java:109)
 com.mongodb.internal.connection.SocketStream.read(SocketStream.java:131)
 com.mongodb.internal.connection.InternalStreamConnection.receiveResponseBuffers(InternalStreamConnection.java:647)
 com.mongodb.internal.connection.InternalStreamConnection.receiveMessageWithAdditionalTimeout(InternalStreamConnection.java:512)
 com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:355)
 com.mongodb.internal.connection.InternalStreamConnection.receive(InternalStreamConnection.java:315)
 com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.lookupServerDescription(DefaultServerMonitor.java:215)
 com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:144)
 java.lang.Thread.run(Thread.java:750)
Oct 10, 2023 9:40:06 PM org.apache.catalina.loader.WebappClassLoaderBase clearReferencesThreads
WARNING: The web application [ROOT] appears to have started a thread named [cluster-rtt-ClusterId{value='6525775bd54ff65387d86e72', description='null'}-localhost:27017] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 java.lang.Thread.sleep(Native Method)
 com.mongodb.internal.connection.DefaultServerMonitor.waitForNext(DefaultServerMonitor.java:435)
 com.mongodb.internal.connection.DefaultServerMonitor.access$1300(DefaultServerMonitor.java:57)
 com.mongodb.internal.connection.DefaultServerMonitor$RoundTripTimeRunnable.run(DefaultServerMonitor.java:409)
 java.lang.Thread.run(Thread.java:750)

Java配置类

@Configuration
@EnableCaching
public class CacheConfig {


    @Bean
    public CacheManager caffeineCacheManager() {
        CaffeineCacheManager cacheManager = new CaffeineCacheManager();
        cacheManager.setCacheNames(Arrays.asList("task1"));
        cacheManager.setCaffeine(caffeineCacheBuilder());
        return cacheManager;
    }

    Caffeine<Object, Object> caffeineCacheBuilder() {
        return Caffeine.newBuilder()
                .expireAfterWrite(30, TimeUnit.DAYS) // Set TTL for 30 Days
                .maximumSize(5000); // Set maximum size to 5000 entries
    }

    @Bean
    public CacheManager cacheManager() {
        SimpleCacheManager cacheManager = new SimpleCacheManager();
        cacheManager.setCaches(Arrays.asList(new ConcurrentMapCache("task2")));
        return cacheManager;
    }

}

Maven依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
    <version>2.7.0</version>
</dependency>

注:仅同时使用两种缓存机制时会触发异常,单独使用任意一种均运行正常。


问题分析与解决方案

Spring Boot支持同时使用多种缓存机制,你遇到的异常本质是容器中存在多个CacheManager Bean时,Spring无法确定默认使用哪一个,导致缓存初始化逻辑异常,间接引发MongoDB线程未正常关闭的问题。

修复步骤:

  1. 指定默认缓存管理器
    在其中一个CacheManager的Bean方法上添加@Primary注解,标记为默认使用的缓存管理器。比如将Caffeine缓存设为默认:

    @Bean
    @Primary
    public CacheManager caffeineCacheManager() {
        // 原有代码不变
    }
    
  2. 使用指定缓存管理器
    在业务代码中使用缓存时,通过cacheManager属性指定要使用的缓存管理器Bean名称:

    // 使用Caffeine缓存
    @Cacheable(value = "task1", cacheManager = "caffeineCacheManager")
    public YourObject getTask1Data() {
        // 业务逻辑
    }
    
    // 使用Simple缓存
    @Cacheable(value = "task2", cacheManager = "cacheManager")
    public YourObject getTask2Data() {
        // 业务逻辑
    }
    
  3. MongoDB线程泄漏补充检查
    虽然异常由缓存配置冲突引发,但可以额外检查MongoDB连接配置,确保使用Spring Boot自动配置的MongoTemplate,并在应用关闭时正确释放连接池资源。

内容的提问来源于stack exchange,提问作者Harish Mahi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 14:45:15