2017-04-19 4 views
4

Ich habe Antworten in einigen Threads gesehen, aber nicht für mich funktioniert und da mein Problem gelegentlich auftritt, diese Frage zu stellen, wenn jemand eine Idee hat.Jedis, kann nicht Jedis-Verbindung erhalten: kann keine Ressource aus Pool

Ich verwende 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 funktioniert gut, aber gelegentlich unter Ausnahme bekommen:

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 konfrontiert oder eine Idee haben, auf diesem, warum könnte Dies geschieht?

+0

Bitte buchen Sie die vollständige Stack-Trace. – mp911de

+0

@ mp911de: Wird zur Verfügung stellen, sobald ich Daten habe. Wir haben unseren Server neu gestartet, haben also keine Protokolle, und da dieses Problem gelegentlich auftritt, rate ich, dass ich warten muss. –

+0

Das ist nicht die vollständige Stack-Ablaufverfolgung. Der Grund für den Verbindungsfehler liegt normalerweise ganz am Ende (eine Ursache für "JedisConnectionException"). – mp911de

Antwort

1

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 Tagen des Debugging dachten wir schließlich heraus, was das Problem verursacht:

redisTemplate.setEnableTransactionSupport(true) 

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

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

+0

Ich hatte das gleiche Problem, aber in meinem Fall verwende ich RxJava. Die transaktionsunterstützenden Klassen von spring-data-redisis scheinen ThreadLocal-Variablen zu verwenden, die in meinem Fall nicht funktionieren. Verwenden Sie asynchrone Frameworks? – Thomas

+0

@Thomas es war auch RxJava in unserem Fall, habe ich meine Antwort aktualisiert. – woezelmann

+0

@Thomas Ich habe deine Antwort schon gesehen, schon einige Zeit habe ich diese Fragen gepostet.Ich habe dieses Problem gelöst, indem ich mit Konfigurationen gespielt habe, die unter config hinzugefügt wurden, wodurch mein Problem gelöst wurde: poolConfig.setMaxIdle (30); poolConfig.setMinIdle (10); –

0

Ich bin von redis.template zu plain jedis gegangen. unter Konfiguration hinzugefügt für Pool (kann in redis Vorlage zu hinzugefügt werden) und sieht keine Ausnahme jetzt:

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

für redis Vorlage:

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

Samen oben config in redis hinzugefügt werden Vorlage auch.

Nicht sicher, wie dies das Problem behebt, obwohl es für mich sinnvoll ist, dass das Halten von max idle einige ungenutzte Verbindungen auch im Pool für den Gebrauch hält.

Wenn jemand erklären kann, warum diese Konfiguration mein Problem behoben würde großartig sein.