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线程未正常关闭的问题。
修复步骤:
指定默认缓存管理器
在其中一个CacheManager的Bean方法上添加@Primary注解,标记为默认使用的缓存管理器。比如将Caffeine缓存设为默认:@Bean @Primary public CacheManager caffeineCacheManager() { // 原有代码不变 }使用指定缓存管理器
在业务代码中使用缓存时,通过cacheManager属性指定要使用的缓存管理器Bean名称:// 使用Caffeine缓存 @Cacheable(value = "task1", cacheManager = "caffeineCacheManager") public YourObject getTask1Data() { // 业务逻辑 } // 使用Simple缓存 @Cacheable(value = "task2", cacheManager = "cacheManager") public YourObject getTask2Data() { // 业务逻辑 }MongoDB线程泄漏补充检查
虽然异常由缓存配置冲突引发,但可以额外检查MongoDB连接配置,确保使用Spring Boot自动配置的MongoTemplate,并在应用关闭时正确释放连接池资源。
内容的提问来源于stack exchange,提问作者Harish Mahi
相关产品推荐
相关产品推荐

