org.springframework.dao.InvalidDataAccessApiUsageException: Redisson is shutdown; nested exception is org.redisson.RedissonShutdownException: Redisson is shutdown
时间: 2025-03-17 14:13:06 浏览: 86
<think>好的,用户遇到了Redisson关闭导致的InvalidDataAccessApiUsageException异常,需要解决方案。首先,我需要回忆一下相关的Spring Boot和Redisson知识。Redisson是一个Redis客户端,如果在使用过程中被意外关闭,可能会导致与数据库操作相关的事务异常,比如InvalidDataAccessApiUsageException。用户提到的RedissonShutdownException可能是在Redisson关闭时抛出的,进而影响了Spring的事务管理。
接下来,我需要结合用户提供的引用内容。引用1提到Shiro导致事务失效,引用2是数据库操作报错,引用3关于JPA版本管理,引用4是Redis缓存配置错误导致的类似异常。虽然用户的问题涉及Redisson,但引用4中的Redis配置问题可能有参考价值。
可能的原因有几个:1. Redisson连接池配置不当,导致连接提前关闭;2. Redisson实例在事务未完成时被关闭;3. Spring事务管理未能正确处理Redisson的关闭事件;4. 依赖版本冲突,比如Spring Boot与Redisson版本不兼容。
解决方案方面,首先应确保Redisson正确配置,连接参数如超时时间足够。其次,检查Redisson的生命周期管理,确保在Spring容器关闭前正确关闭Redisson,避免事务未提交时连接断开。然后,处理RedissonShutdownException,通过异常捕获或重试机制。另外,版本兼容性也很重要,需要确认Spring Boot和Redisson的版本匹配。最后,增加健康检查,监控Redisson状态,及时发现问题。
需要验证这些步骤的有效性,比如检查配置文件中关于Redisson的部分,添加@PreDestroy方法确保关闭顺序,使用AOP处理异常,或者调整依赖版本。同时,参考引用4中的Redis配置错误,用户可能需要检查自己的Redisson配置是否正确,比如序列化方式或连接参数。
用户可能还希望具体的代码示例,比如如何配置Bean的生命周期,如何捕获异常,或者版本推荐。因此,在回答中应包含具体的步骤和代码片段,帮助用户一步步解决问题,并确保引用了相关的资料,如版本管理相关的引用3。</think>### Spring Boot Redisson关闭导致InvalidDataAccessApiUsageException的解决方案
#### 问题分析
当Redisson客户端意外关闭时,可能导致两种异常:
1. `InvalidDataAccessApiUsageException`:通常与数据库操作上下文失效相关(如Hibernate Session或JPA EntityManager异常断开)[^2]
2. `RedissonShutdownException`:直接表明Redisson客户端已终止服务
常见触发场景包括:
- Redisson连接池配置不当(最大空闲时间过短)
- 手动调用`redisson.shutdown()`未正确处理
- Spring容器关闭顺序异常(先关闭数据库连接池后关闭Redisson)
- 依赖版本冲突(如Spring Boot与Redisson版本不匹配)[^3][^4]
---
#### 分步解决方案
##### 1. 配置优化(核心)
```yaml
# application.yml
redisson:
config: |
singleServerConfig:
address: "redis://127.0.0.1:6379"
idleConnectionTimeout: 30000 # 空闲连接超时时间(默认30秒)
connectTimeout: 10000 # 连接建立超时时间
timeout: 3000 # 命令等待超时
retryAttempts: 3 # 命令重试次数
retryInterval: 1500 # 重试间隔
subscriptionsPerConnection: 5 # 每个连接最大订阅量
```
##### 2. 生命周期管理
```java
@Configuration
public class RedissonConfig {
@Bean(destroyMethod = "shutdown")
public RedissonClient redisson() throws IOException {
Config config = Config.fromYAML(...);
return Redisson.create(config);
}
@PreDestroy
public void destroy() {
// 确保在Spring容器关闭前完成清理
TransactionSynchronizationManager.unbindResourceIfPossible(redisson);
}
}
```
##### 3. 异常处理增强
```java
@Aspect
@Component
public class RedissonAspect {
@Around("execution(* com.yourpackage..*(..))")
public Object handleRedissonException(ProceedingJoinPoint pjp) throws Throwable {
try {
return pjp.proceed();
} catch (RedissonShutdownException e) {
// 记录日志并尝试重连
log.error("Redisson connection lost, attempting to reconnect...");
redissonClient = recreateClient(); // 重新初始化客户端
throw new ServiceUnavailableException("Redis service recovering");
}
}
}
```
##### 4. 版本兼容性检查
推荐版本组合:
| Spring Boot | Redisson |
|-------------|----------|
| 2.7.x | 3.17.5 |
| 2.6.x | 3.16.8 |
| 2.5.x | 3.15.6 |
可通过Maven排除冲突依赖:
```xml
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>${redisson.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</exclusion>
</exclusions>
</dependency>
```
##### 5. 健康检查集成
```java
@Configuration
public class HealthConfig {
@Bean
public HealthIndicator redissonHealthIndicator(RedissonClient redisson) {
return () -> {
if (redisson.isShutdown()) {
return Health.down().build();
}
return Health.up().build();
};
}
}
```
---
#### 验证步骤
1. 通过`/actuator/health`端点检查Redisson状态
2. 注入`RedissonClient`手动测试连接:
```java
@Test
void testRedissonConnection() {
RAtomicLong atomicLong = redisson.getAtomicLong("test");
atomicLong.set(1L); // 无异常表示连接正常
}
```
---
阅读全文
相关推荐


















