2017-10-06 28 views
1

私はWebアプリケーションを作成しており、データ保存にRedisを使用しています。 私はJedisPoolConfig(redis client-jedisバージョン2.9.0)を使用しました。 だから私は、次の構成でのApacheのJMeterの助けを借りて、自分のアプリケーションをテストする場合:春アプリケーションの起動時にビーンとして作成され、このコードでJedis接続を取得できません。プールからリソースを取得できませんでした。

redis.sentinel.enable=true 
redis.sentinel.ip=localhost 
redis.sentinel.port=6379 
redis.instance.account.masterName=master 
redis.pool.max-active = 20 
redis.pool.max-idle = 10 

(:

Number of threads(Users): 30 
Ramp-Up period(in seconds) : 0 
Loop-Count : 1 

とJedisPoolConfig次の構成を持ちます):毎回リクエストを新しい接続を取得するため、このコードで

JedisConnectionFactory factory = new JedisConnectionFactory(); 
     factory.setPort(port); 
     factory.setHostName(hostName); 
     factory.afterPropertiesSet(); 
     factory.setUsePool(true); 
     JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); 
     jedisPoolConfig.setMaxTotal(redisPoolMaxActive); 
     jedisPoolConfig.setMaxIdle(redisPoolMaxIdle); 
     factory.setPoolConfig(jedisPoolConfig); 
     return factory; 

が来る:

@Autowired 
private JedisConnectionFactory redisConnectionFactory; 
private StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); 
private RedisTemplate getNewConnection(){ 
     RedisTemplate redisTemplate = new RedisTemplate(); 
     redisTemplate.setConnectionFactory(redisConnectionFactory); 
     redisTemplate.setKeySerializer(stringRedisSerializer); 
     redisTemplate.setHashKeySerializer(stringRedisSerializer); 
     redisTemplate.setValueSerializer(stringRedisSerializer); 
     redisTemplate.afterPropertiesSet(); 
     return redisTemplate; 
    } 

編集:Redisの内部マルチ/ execのためredisTemplateのための私の使用:

redisTemplate.setEnableTransactionSupport(true); 

redisTemplate.multi(); 

for (ArrayList<Pair<String, String>> pairs : keys){ 
    for (Pair<String,String> pair: pairs) 
     redisTemplate.opsForHash().get(makeMap(pair.getFirst(), version) , pair.getSecond()); 
} 

return redisTemplate.exec(); 

私は正常に20個の要求に対する応答を取得しますが、残りの10個の要求に対する応答を取得できませんでした。私が検索しました

2017-10-06 17:38:11.753 ERROR 3539 --- [io-8080-exec-12] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool] with root cause 

java.util.NoSuchElementException: Timeout waiting for idle object 
    at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:449) ~[commons-pool2-2.4.2.jar:2.4.2] 
    at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363) ~[commons-pool2-2.4.2.jar:2.4.2] 
    at redis.clients.util.Pool.getResource(Pool.java:49) ~[jedis-2.9.0.jar:na] 
    at redis.clients.jedis.JedisPool.getResource(JedisPool.java:226) ~[jedis-2.9.0.jar:na] 
    at redis.clients.jedis.JedisPool.getResource(JedisPool.java:16) ~[jedis-2.9.0.jar:na] 
    at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:194) ~[spring-data-redis-1.8.6.RELEASE.jar:na] 
    at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.getConnection(JedisConnectionFactory.java:348) ~[spring-data-redis-1.8.6.RELEASE.jar:na] 
    at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:129) ~[spring-data-redis-1.8.6.RELEASE.jar:na] 
    at org.springframework.data.redis.core.RedisConnectionUtils.bindConnection(RedisConnectionUtils.java:67) ~[spring-data-redis-1.8.6.RELEASE.jar:na] 
    at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:192) ~[spring-data-redis-1.8.6.RELEASE.jar:na] 
    at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:169) ~[spring-data-redis-1.8.6.RELEASE.jar:na] 
    at org.springframework.data.redis.core.RedisTemplate.multi(RedisTemplate.java:868) ~[spring-data-redis-1.8.6.RELEASE.jar:na] 
    at net.media.mml.redis.repository.RedisRepository.makeTransaction(RedisRepository.java:50) ~[max-data-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] 
    at net.media.mml.redis.repository.RedisRepository.getFromRedis(RedisRepository.java:66) ~[max-data-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] 
    at net.media.mml.service.DimensionGetter.getDimensions(DimensionGetter.java:64) ~[ml-api.jar:0.0.1-SNAPSHOT] 
    at net.media.mml.service.MLQueriesGetter.makeQueries(MLQueriesGetter.java:32) ~[ml-api.jar:0.0.1-SNAPSHOT] 
    at net.media.mml.controller.MaxQueryController.query(MaxQueryController.java:61) ~[ml-api.jar:0.0.1-SNAPSHOT] 
    at sun.reflect.GeneratedMethodAccessor270.invoke(Unknown Source) ~[na:na] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_131] 
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_131] 
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-4.3.10.RELEASE.jar:4.3.10.RELEASE] 

:私は直面しています問題は、20台の接続は最初の20個の要求によって使用された後、残りの10個の要求は、プールからjedis接続を取得することができませんので、私は次の例外を取得していますネット上では解決策を見つけることができません。誰か助けてくれますか?

+0

それはあなたのアプリケーションから利用できるよう、完全なスタックトレースを投稿してください。 – mp911de

+0

@ mp911de、私は完全な例外を編集しました。 –

+0

私はまた、この設定のネット上で見つけた:jedisPoolConfig.getBlockWhenExhausted();このパラメータは、ディオールによって真です。 jedispoolconfig doesnotは、すべての接続が使用されているときに実際に要求をブロックしないようです。 –

答えて

0

Redisトランザクションを使用するには、コールバックでの呼び出しが必要です。 setEnableTransactionSupport(true)は、トランザクションマネージャ/ @Transactional用です。詳細は、reference documentationを参照してください。

setEnableTransactionSupport(true)を使用しないでください。トランザクションマネージャがない場合は、使用しないでください。

あなたしているコードは次のようになります。

​​
関連する問題