2017-04-19 1 views
4

두 개의 스레드에서 답변을 보았지만 나에게 도움이되지 못했고 때때로 문제가 발생했기 때문에이 질문을 던지십시오.Jedis, jedis 연결을 얻을 수 없습니다. 풀에서 리소스를 가져올 수 없습니다.

jedis 버전 2.8.0, 스프링 데이터 redis 버전 1.7.5를 사용하고 있습니다. 캐싱 응용 프로그램 용 서버 버전 2.8.4가 있습니다.

내가 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) 

내 레디 스 구성 클래스 :

@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) 

어떻게 든 스프링 데이터가 다시 연결을 해제하지 않습니다. MULTI/EXEC에 대한 트랜잭션 지원이 필요했지만 결국이 문제를 없애기 위해 구현을 변경했습니다.

Google의 버그 또는 잘못된 사용인지 계속해서 알 수 있습니다.

+0

동일한 문제가 있었지만 제 경우에는 RxJava를 사용하고 있습니다. spring-data-redis의 트랜잭션 지원 클래스는 ThreadLocal 변수를 사용하는 것으로 보이는데, 이는 제 경우에는 작동하지 않습니다. 비동기 프레임 워크를 사용하고 있습니까? – Thomas

+0

@Thomas 우리의 경우에는 RxJava이기도한데, 나는 나의 대답을 업데이트했다. – woezelmann

+0

@ 토마스 당신의 대답을 보았습니다. 나는이 질문을 올렸습니다.나는이 문제를 풀어서 문제를 해결했다. 아래에 config를 추가하여 문제를 해결했다. poolConfig.setMaxIdle (30); poolConfig.setMinIdle (10); –

0

redis.template에서 plain jedis로 옮겼습니다. 구성 아래에 추가 은 풀 (너무 레디 스 템플릿에 추가 할 수 있습니다) 지금은 예외 볼 수 없습니다 :

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

레디 스 템플릿 :

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

같은 위의 설정은 레디 스에 추가 할 수 있습니다 템플릿도.

최대 유휴 상태로 유지하는 것이 풀에서 유휴 연결을 너무 길게 유지한다는 점이 나에게 이치에 맞지만 문제가 어떻게 해결되는지 잘 모르겠습니다.

누군가가이 구성이 왜 고정되어 있는지 설명 할 수 있다면 내 문제가 커질 것입니다.

관련 문제