Jedis connections not being released

3.8k Views Asked by At

I am having issues using Redis with a Jedis connection pool.

The behaviour I am seeing is that after connections are established they are not being released back into the connection pool.

I know this because using the redis-cli client list command I can see the connections still hanging around.

Can someone please review my jedis connection pool to let me know if that might be causing the issue.

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

Where the properties are set as follows...

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
1

There are 1 best solutions below

0
On BEST ANSWER

Your maxIdle setting is larger than your maxTotal setting, so effectively no connections will be released on idle. The pool will maintain maxIdle connections.

JedisPool uses Apache Commons Pooling internally. See this answer regarding the differences between maxIdle and maxTotal.