Frage Jedis, kann Jedis Verbindung nicht bekommen: kann Ressource vom Pool nicht erhalten


Ich habe Antworten in einigen Threads gesehen, aber für mich nicht funktioniert und da mein Problem gelegentlich auftritt, diese Frage zu stellen, wenn jemand eine Idee hat.

Ich benutze Jedis Version 2.8.0, Spring Data Redis Version 1.7.5. und Redis-Server Version 2.8.4 für unsere Caching-Anwendung.

Ich habe mehrere Cache, die in Redis gespeichert wird und Anforderung von Redis erhalten wird. Ich verwende Spring-Data-Redis-APIs zum Speichern und Abrufen von Daten.

Alle speichern und erhalten funktioniert gut, aber gelegentlich Ausnahme unter:

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)

Meine Redis-Konfigurationsklasse:

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

 }

Hat jemand dieses Problem angepackt oder eine Idee dazu, warum könnte das passieren?


5
2018-04-19 10:02


Ursprung


Antworten:


Wir hatten das gleiche Problem mit RxJava, die Anwendung lief gut, aber nach einiger Zeit konnten keine Verbindungen mehr aus dem Pool genommen werden. Nach einigen Tagen des Debuggens haben wir herausgefunden, was das Problem verursacht hat:

redisTemplate.setEnableTransactionSupport(true)

irgendwie verursacht Feder-Daten-Redis, Verbindungen nicht freizugeben. Wir benötigten Transaktionsunterstützung für MULTI / EXEC, aber am Ende wurde die Implementierung geändert, um dieses Problem zu beheben.

Dennoch wissen wir nicht, ob dies ein Bug oder eine falsche Verwendung auf unserer Seite ist.


1
2017-08-12 13:25



Ich bin von redis.template zu plain jedis gegangen. Hinzugefügt unten Konfiguration (kann auch in Redis-Vorlage hinzugefügt werden) für Pool und sehe jetzt keine Ausnahme:

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

für Redis-Vorlage:

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

Die selbe obige Konfiguration kann auch in der Redis-Vorlage hinzugefügt werden.

Ich bin mir nicht sicher, wie dies das Problem behebt, obwohl es für mich Sinn macht, dass ich im Leerlauf einige ungenutzte Verbindungen im Pool für den Gebrauch behalte.

Wenn jemand erklären kann, warum diese Konfiguration mein Problem behoben hat, wäre das großartig.


0
2017-08-24 08:45