2017-04-19 41 views
4

私はスレッドのカップルで答えを見ましたが、私のためにうまくいかなかったし、私の問題が時折発生するので、Jedis、jedis接続できません:プールからリソースを取得できません

私はjedisバージョン2.8.0、Spring Data redisバージョン1.7.5を使用しています。キャッシングアプリケーション用のサーバーバージョン2.8.4のredisです。

私はredisで保存され、要求を得る複数のキャッシュをredisから実行します。私は春のデータ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の設定クラスは:

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

} 

は、誰もがこの問題に直面したか、この上の任意のアイデアを持って、なぜかもしれませんでしたこれが起こる?

+0

完全なスタックトレースを投稿してください。 – mp911de

+0

@ mp911de:データを取得したら提供します。私たちはサーバを再起動したので、ログを持っていません。この問題は時折発生するため、待つ必要があるかもしれません。 –

+0

これは完全なスタックトレースではありません。接続失敗の理由は、通常、最後にあります( 'JedisConnectionException'の原因)。 – mp911de

答えて

1

RxJavaで同じ問題が発生しましたが、アプリケーションは正常に動作していましたが、しばらくしてもプールから接続を取得できなくなりました。

redisTemplate.setEnableTransactionSupport(true) 

何とか原因春・データ・Redisの接続を解放しないために:デバッグの日の後に我々は最終的に、問題の原因を考え出しました。 MULTI/EXECのトランザクションサポートが必要でしたが、結局この問題を取り除くために実装を変更しました。

これがバグか誤っているかどうかはわかりません。

+0

私は同じ問題を抱えていましたが、私の場合はRxJavaを使用しています。 spring-data-redisのトランザクションサポートクラスは、私の場合は動作しないThreadLocal変数を使用しているようです。非同期フレームワークを使用していますか? – Thomas

+0

@トーマス私たちのケースではRxJavaだったので、私は答えを更新しました。 – woezelmann

+0

@Thomasちょうどあなたの答えを見た、私はこの質問を投稿した時間です。私は、問題を解決した設定の下に追加された設定で遊んでこの問題を解決しました。 poolConfig.setMaxIdle(30); poolConfig.setMinIdle(10); –

0

redis.templateからplain jedisに移動しました。コンフィギュレーションの下に追加 は(あまりにもRedisのテンプレートに追加することができます)プールのため、現在は任意の例外が表示されない:Redisのテンプレートの

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

を:

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

同上configがRedisの中に追加することができますテンプレートも。

これがどのように問題を解決しているのかよく分かりませんが、最大アイドル状態を維持すると、プール内で空いている接続が使用されてしまいます。

誰でもこの設定を修正した理由を説明できれば、私の問題は素晴らしいものになります。

関連する問題