2017-09-04 129 views
1

我遇到了使用Redis和Jedis连接池的问题。Jedis连接未被释放

我看到的行为是在连接建立之后,它们不会被释放回连接池。

我知道这一点,因为使用redis-cli client list命令我可以看到连接仍然悬而未决。

有人可以查看我的jedis连接池,让我知道如果这可能导致问题。

 <spring:bean id="ElasticachePoolConfig" name="ElasticachePoolConfig" class="redis.clients.jedis.JedisPoolConfig" > 

     <!-- Minimum number of idle connections to Redis - these can be seen as always open and ready to serve --> 
     <spring:property name="minIdle" value="${redis.minIdle}" /> 

     <!-- Number of connections to Redis that just sit there and do nothing --> 
     <spring:property name="maxIdle" value="${redis.maxIdle}" /> 

     <!-- Maximum number of active connections that can be allocated from this pool at the same time --> 
     <spring:property name="maxTotal" value="${redis.maxTotal}" /> 

     <!-- The minimum amount of time an object may sit idle in the pool before it is eligable for eviction by the idle object evictor.--> 
     <spring:property name="minEvictableIdleTimeMillis" value="${redis.minEvictableIdleTimeMillis}" /> 

     <!-- The minimum amount of time a connection may sit idle in the pool before it is eligible for eviction by the idle connection evictor --> 
     <spring:property name="softMinEvictableIdleTimeMillis" value="${redis.softMinEvictableIdleTimeMillis}" /> 

     <!-- The maximum number of milliseconds that the pool will wait (when there are no available connections) for a connection to be returned before throwing an exception --> 
     <spring:property name="maxWaitMillis" value="${redis.maxWaitMillis}" /> 

     <!-- Maximum number of connections to test in each idle check --> 
     <spring:property name="numTestsPerEvictionRun" value="${redis.numTestsPerEvictionRun}" /> 

     <!-- Tests whether connection is dead when connection retrieval method is called --> 
     <spring:property name="testOnBorrow" value="${redis.testOnBorrow}" /> 

     <!-- Tests whether connection is dead when returning a connection to the pool --> 
     <spring:property name="testOnReturn" value="${redis.testOnReturn}" /> 

     <!-- Tests whether connections are dead during idle periods --> 
     <spring:property name="testWhileIdle" value="${redis.testWhileIdle}" /> 

     <!-- Idle connection checking period --> 
     <spring:property name="timeBetweenEvictionRunsMillis" value="${redis.timeBetweenEvictionRunsMillis}" /> 

     <spring:property name="blockWhenExhausted" value="${redis.blockWhenExhausted}" /> 

    </spring:bean> 

,其中属性设置如下......

redis.port=6379 
redis.timeout=2000 
redis.ttl=600 
redis.host=localhost 
redis.repeater.maxRetries=3 
redis.repeater.millisBetweenRetries=2000 
redis.minIdle=5 
redis.maxIdle=10 
redis.maxTotal=8 
redis.minEvictableIdleTimeMillis=30000 
redis.softMinEvictableIdleTimeMillis=-1 
redis.maxWaitMillis=5000 
redis.numTestsPerEvictionRun=10 
redis.testOnBorrow=true 
redis.testOnReturn=true 
redis.testWhileIdle=false 
redis.timeBetweenEvictionRunsMillis=50000 
redis.blockWhenExhausted=true 
+0

“我看到的行为是在建立连接后,它们不会被释放回连接池中,我知道这是因为使用redis-cli客户端列表命令,我可以看到连接仍处于闲置状态。”不合逻辑的推论。连接应该留在周围。您将*打开*连接放回到连接池中,而不是关闭的:) – hobbs

+0

嗨@hobbs感谢您的回复。你是对的。但是在驱逐运行时,连接不应该回落到我的最小空闲连接? – Richie

+0

它应该下降到不超过'maxIdle'。 – hobbs

回答

0

maxIdle设置比你maxTotal设定较大,所以没有有效的连接将被闲置释放。该池将保持maxIdle连接。

JedisPool在内部使用Apache Commons Pooling。有关maxIdlemaxTotal之间的差异,请参阅this answer