web-dev-qa-db-fra.com

Jedis, impossible d'obtenir une connexion jedis: impossible d'obtenir une ressource du pool

J'ai vu des réponses en quelques fils mais cela n'a pas fonctionné pour moi et comme mon problème survient de temps en temps, je pose cette question si quelqu'un a une idée.

J'utilise la version 2.8.0 de Jedis, la version 1.7.5 de Red Data. et redis server version 2.8.4 pour notre application de mise en cache.

J'ai plusieurs antémémoires qui sont enregistrées dans Redis et dont la demande est effectuée à partir de Redis. J'utilise les API Spring Data Redis pour enregistrer et obtenir des données.

Tous sauvegardent et obtiennent des travaux corrects, mais nous obtenons parfois une exception en dessous de l'exception:

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)

Ma classe de configuration 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;
 }

 }

Quelqu'un a-t-il rencontré ce problème ou une idée à ce sujet, pourquoi cela pourrait-il se produire?

6
Bikas Katwal

Je suis passé de redis.template à plain jedis. Ajouté en dessous de la configuration (peut également être ajouté dans le modèle Redis) pour le pool et ne voit aucune exception:

jedisPoolConfig.setMaxIdle(30);
jedisPoolConfig.setMinIdle(10);

pour le modèle Redis:

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

La configuration ci-dessus peut également être ajoutée dans le modèle Redis.

1
Bikas Katwal

Nous étions confrontés au même problème avec RxJava, l’application fonctionnait correctement, mais après un certain temps, plus aucune connexion ne pouvait être établie depuis la piscine. Après des jours de débogage, nous avons finalement trouvé la cause du problème:

redisTemplate.setEnableTransactionSupport(true)

en quelque sorte, spring-data-redis ne libère pas les connexions. Nous avions besoin d'un support transactionnel pour MULTI/EXEC, mais nous avons finalement modifié l'implémentation pour résoudre ce problème.

Nous ne savons toujours pas s'il s'agit d'un bug ou d'une mauvaise utilisation de notre part.

3
woezelmann