Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 绝地,无法获取绝地连接:无法从池中获取资源_Spring_Redis_Jedis_Spring Data Redis - Fatal编程技术网

Spring 绝地,无法获取绝地连接:无法从池中获取资源

Spring 绝地,无法获取绝地连接:无法从池中获取资源,spring,redis,jedis,spring-data-redis,Spring,Redis,Jedis,Spring Data Redis,我已经在几个线程中看到了答案,但对我来说没有效果,因为我的问题偶尔会出现,问这个问题,如果有人知道的话 我使用的是绝地武士2.8.0版,Spring Data redis 1.7.5版。以及我们的缓存应用程序的redis服务器版本2.8.4 我有多个缓存,保存在redis中,get请求是从redis完成的。我正在使用SpringDataRedisAPI来保存和获取数据 所有“保存并获取”都可以正常工作,但偶尔会出现以下异常: Cannot get Jedis connection; nested

我已经在几个线程中看到了答案,但对我来说没有效果,因为我的问题偶尔会出现,问这个问题,如果有人知道的话

我使用的是绝地武士2.8.0版,Spring Data redis 1.7.5版。以及我们的缓存应用程序的redis服务器版本2.8.4

我有多个缓存,保存在redis中,get请求是从redis完成的。我正在使用SpringDataRedisAPI来保存和获取数据

所有“保存并获取”都可以正常工作,但偶尔会出现以下异常:

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配置类:

@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;
 }

 }
@配置
公共类配置{
@值(${redisCentralCachingURL}”)
私有字符串主机;
@值(${redisCentralCachingPort}”)
私人int再报告;
@豆子
公共StringRedisSerializer StringRedisSerializer(){
StringRedisSerializer StringRedisSerializer=新的StringRedisSerializer();
返回字符串重新序列化器;
}
@豆子
绝地连接工厂绝地连接工厂(){
JedisConnectionFactory=新的JedisConnectionFactory();
setHostName(redisHost);
工厂设置端口(重新端口);
factory.setUsePool(true);
返回工厂;
}
@豆子
公共RedisTemplate RedisTemplate(){
RedisTemplate RedisTemplate=新RedisTemplate();
redisTemplate.setConnectionFactory(jedisConnectionFactory());
redisTemplate.setExposeConnection(true);
//没有序列化程序需要在impl期间完成所有序列化
setKeySerializer(stringRedisSerializer());
//`setHashKeySerializer(stringRedisSerializer());
redisTemplate.setHashValueSerializer(新的GenericsAppyredisSerializer());
redisTemplate.AfterPropertieSet();
返回模板;
}
@豆子
公共RedisCacheManager cacheManager(){
RedisCacheManager RedisCacheManager=新的RedisCacheManager(redisTemplate());
redisCacheManager.setTransactionWare(true);
redisCacheManager.setLoadRemoteCachesOnStartup(true);
redisCacheManager.setUsePrefix(true);
返回管理器;
}
}

有没有人遇到过这个问题,或者对此有什么想法,为什么会发生这种情况?

我们在使用RxJava时也遇到了同样的问题,应用程序运行正常,但过了一段时间,无法再从池中获取连接。经过几天的调试,我们终于找出了问题的原因:

redisTemplate.setEnableTransactionSupport(true)
不知何故导致SpringDataRedis不释放连接。我们需要对MULTI/EXEC的事务支持,但最终改变了实现以解决这个问题


我们仍然不知道这是一个bug还是我们这边的错误用法。

我从redis.template迁移到普通绝地。 为池添加了以下配置(也可以在redis模板中添加),现在看不到任何异常:

jedisPoolConfig.setMaxIdle(30);
jedisPoolConfig.setMinIdle(10);
对于redis模板:

jedisConnectionFactory.getPoolConfig().setMaxIdle(30);
jedisConnectionFactory.getPoolConfig().setMinIdle(10);

同样的上述配置也可以添加到redis模板中。

请发布完整的堆栈跟踪。@mp911de:将在我有数据后提供。我们已重新启动服务器,因此没有日志,而且由于此问题偶尔发生,我想我可能需要等待。这不是完整的堆栈跟踪。连接失败的原因通常在最末尾(导致
JedisConnectionException
)。我无法在应用程序中打印堆栈跟踪。所以我试图从Throwable.getStackTrace()中捕获它,并记录它。这给了我堆栈上的跟踪。stacktrace中还有更多内容,但这是我的应用程序方法,我没有包括在内。这就是我所拥有的。我也有同样的问题,但在我的例子中,我使用的是RxJava。SpringDataRedis的事务支持类似乎使用ThreadLocal变量,这在我的例子中不起作用。你在使用异步框架吗?@Thomas在我们的例子中也是RxJava,我更新了我的答案。@Thomas刚刚看到了你的答案,有一段时间我发布了这个问题。我确实通过使用配置解决了这个问题,配置下面添加了配置,解决了我的问题:poolConfig.setMaxIdle(30);poolConfig.setMinIdle(10);看来这对我也有帮助,但我不知道为什么。你介意详细说明一下吗?基本上,我的问题是,如果我的应用程序没有空闲的连接怎么办。(当前连接>最大空闲)