Jedis,无法获得jedis连接:无法从池中获取资源
Jedis, Cannot get jedis connection: cannot get resource from pool
我在几个线程中看到了答案,但对我没有解决,因为我的问题偶尔会出现,如果有人有任何想法,请问这个问题。
我使用的jedis 2.8.0版本,Springdata redis 1.7.5版本。和我们的缓存应用程序的 Redis 服务器版本 2.8.4。
我有多个缓存保存在 redis 中,获取请求是从 redis 完成的。我正在使用 spring data redis API 来保存和获取数据。
所有保存和获取工作正常,但偶尔会出现以下异常:
Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool | org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the poolorg.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:198)
org.springframework.data.redis.connection.jedis.JedisConnectionFactory.getConnection(JedisConnectionFactory.java:345)
org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:129)
org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:92)
org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:79)
org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:191)
org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:166)
org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:88)
org.springframework.data.redis.core.DefaultHashOperations.get(DefaultHashOperations.java:49)
我的redis配置class:
@Configuration
public class RedisConfiguration {
@Value("${redisCentralCachingURL}")
private String redisHost;
@Value("${redisCentralCachingPort}")
private int redisPort;
@Bean
public StringRedisSerializer stringRedisSerializer() {
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
return stringRedisSerializer;
}
@Bean
JedisConnectionFactory jedisConnectionFactory() {
JedisConnectionFactory factory = new JedisConnectionFactory();
factory.setHostName(redisHost);
factory.setPort(redisPort);
factory.setUsePool(true);
return factory;
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(jedisConnectionFactory());
redisTemplate.setExposeConnection(true);
// No serializer required all serialization done during impl
redisTemplate.setKeySerializer(stringRedisSerializer());
//`redisTemplate.setHashKeySerializer(stringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericSnappyRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
@Bean
public RedisCacheManager cacheManager() {
RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate());
redisCacheManager.setTransactionAware(true);
redisCacheManager.setLoadRemoteCachesOnStartup(true);
redisCacheManager.setUsePrefix(true);
return redisCacheManager;
}
}
有没有人遇到过这个问题或对此有任何想法,为什么会发生这种情况?
我们在使用 RxJava 时遇到了同样的问题,应用程序 运行 很好,但过了一段时间后,无法再从池中获取连接。经过几天的调试,我们终于弄清楚了问题的原因:
redisTemplate.setEnableTransactionSupport(true)
不知何故导致 spring-data-redis 不释放连接。我们需要对 MULTI / EXEC 的事务支持,但最终更改了实现以摆脱这个问题。
我们仍然不知道这是错误还是我们这边的错误用法。
我从 redis.template 转到普通绝地武士。
为池添加了以下配置(也可以在 redis 模板中添加),现在看不到任何异常:
jedisPoolConfig.setMaxIdle(30);
jedisPoolConfig.setMinIdle(10);
对于 redis 模板:
jedisConnectionFactory.getPoolConfig().setMaxIdle(30);
jedisConnectionFactory.getPoolConfig().setMinIdle(10);
上面的配置也可以添加到redis模板中。
Redis 配置有问题
对我来说,我在本地使用这个属性,当我评论这个属性时,问题得到解决
#spring.redis.database=12
正确的属性将是
spring.redis.sentinel.master=mymaster
spring.redis.password=
spring.redis.sentinel.nodes=localhost:5000
我在几个线程中看到了答案,但对我没有解决,因为我的问题偶尔会出现,如果有人有任何想法,请问这个问题。
我使用的jedis 2.8.0版本,Springdata redis 1.7.5版本。和我们的缓存应用程序的 Redis 服务器版本 2.8.4。
我有多个缓存保存在 redis 中,获取请求是从 redis 完成的。我正在使用 spring data redis API 来保存和获取数据。
所有保存和获取工作正常,但偶尔会出现以下异常:
Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool | org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the poolorg.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:198)
org.springframework.data.redis.connection.jedis.JedisConnectionFactory.getConnection(JedisConnectionFactory.java:345)
org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:129)
org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:92)
org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:79)
org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:191)
org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:166)
org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:88)
org.springframework.data.redis.core.DefaultHashOperations.get(DefaultHashOperations.java:49)
我的redis配置class:
@Configuration
public class RedisConfiguration {
@Value("${redisCentralCachingURL}")
private String redisHost;
@Value("${redisCentralCachingPort}")
private int redisPort;
@Bean
public StringRedisSerializer stringRedisSerializer() {
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
return stringRedisSerializer;
}
@Bean
JedisConnectionFactory jedisConnectionFactory() {
JedisConnectionFactory factory = new JedisConnectionFactory();
factory.setHostName(redisHost);
factory.setPort(redisPort);
factory.setUsePool(true);
return factory;
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(jedisConnectionFactory());
redisTemplate.setExposeConnection(true);
// No serializer required all serialization done during impl
redisTemplate.setKeySerializer(stringRedisSerializer());
//`redisTemplate.setHashKeySerializer(stringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericSnappyRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
@Bean
public RedisCacheManager cacheManager() {
RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate());
redisCacheManager.setTransactionAware(true);
redisCacheManager.setLoadRemoteCachesOnStartup(true);
redisCacheManager.setUsePrefix(true);
return redisCacheManager;
}
}
有没有人遇到过这个问题或对此有任何想法,为什么会发生这种情况?
我们在使用 RxJava 时遇到了同样的问题,应用程序 运行 很好,但过了一段时间后,无法再从池中获取连接。经过几天的调试,我们终于弄清楚了问题的原因:
redisTemplate.setEnableTransactionSupport(true)
不知何故导致 spring-data-redis 不释放连接。我们需要对 MULTI / EXEC 的事务支持,但最终更改了实现以摆脱这个问题。
我们仍然不知道这是错误还是我们这边的错误用法。
我从 redis.template 转到普通绝地武士。 为池添加了以下配置(也可以在 redis 模板中添加),现在看不到任何异常:
jedisPoolConfig.setMaxIdle(30);
jedisPoolConfig.setMinIdle(10);
对于 redis 模板:
jedisConnectionFactory.getPoolConfig().setMaxIdle(30);
jedisConnectionFactory.getPoolConfig().setMinIdle(10);
上面的配置也可以添加到redis模板中。
Redis 配置有问题
对我来说,我在本地使用这个属性,当我评论这个属性时,问题得到解决
#spring.redis.database=12
正确的属性将是
spring.redis.sentinel.master=mymaster
spring.redis.password=
spring.redis.sentinel.nodes=localhost:5000