From b248bd28936d2674ebbb25a3f5c156d13c69cc28 Mon Sep 17 00:00:00 2001 From: Costin Leau Date: Thu, 20 Jan 2011 12:58:52 +0200 Subject: [PATCH] DATAKV-19 + Jedis connections are returned to the pool instead of being closed --- .../connection/jedis/JedisConnection.java | 30 +++++++++++++++++++ .../jedis/JedisConnectionFactory.java | 3 +- .../collections/CollectionTestParams.java | 2 +- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnection.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnection.java index e8846edee..5f1d9cf08 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnection.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnection.java @@ -44,6 +44,7 @@ import redis.clients.jedis.JedisPubSub; import redis.clients.jedis.SortingParams; import redis.clients.jedis.Transaction; import redis.clients.jedis.ZParams; +import redis.clients.util.Pool; /** * {@code RedisConnection} implementation on top of Jedis library. @@ -62,6 +63,8 @@ public class JedisConnection implements RedisConnection { private final Jedis jedis; private final Client client; private final BinaryTransaction transaction; + private final Pool pool; + private volatile JedisSubscription subscription; @@ -71,10 +74,23 @@ public class JedisConnection implements RedisConnection { * @param jedis Jedis entity */ public JedisConnection(Jedis jedis) { + this(jedis, null); + } + + /** + * + * Constructs a new JedisConnection instance backed by a jedis pool. + * + * @param jedis + * @param pool can be null, if no pool is used + */ + public JedisConnection(Jedis jedis, Pool pool) { this.jedis = jedis; // extract underlying connection for batch operations client = (Client) ReflectionUtils.getField(CLIENT_FIELD, jedis); transaction = new Transaction(client); + + this.pool = pool; } protected DataAccessException convertJedisAccessException(Exception ex) { @@ -90,6 +106,20 @@ public class JedisConnection implements RedisConnection { @Override public void close() throws UncategorizedRedisException { + // return the connection to the pool + try { + if (pool != null) { + pool.returnResource(jedis); + } + } catch (Exception ex) { + pool.returnBrokenResource(jedis); + } + + if (pool != null) { + return; + } + + // else close the connection normally try { if (isQueueing()) { client.quit(); diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnectionFactory.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnectionFactory.java index e857a559c..092e7c9b2 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnectionFactory.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnectionFactory.java @@ -115,7 +115,8 @@ public class JedisConnectionFactory implements InitializingBean, DisposableBean, } public JedisConnection getConnection() { - return new JedisConnection(fetchJedisConnector()); + Jedis jedis = fetchJedisConnector(); + return (usePool ? new JedisConnection(jedis, pool) : new JedisConnection(jedis)); } @Override diff --git a/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/support/collections/CollectionTestParams.java b/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/support/collections/CollectionTestParams.java index c302240c2..e3c7d87f5 100644 --- a/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/support/collections/CollectionTestParams.java +++ b/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/support/collections/CollectionTestParams.java @@ -35,7 +35,7 @@ public abstract class CollectionTestParams { ObjectFactory personFactory = new PersonObjectFactory(); JedisConnectionFactory jedisConnFactory = new JedisConnectionFactory(); - jedisConnFactory.setUsePool(false); + jedisConnFactory.setUsePool(true); jedisConnFactory.setPort(SettingsUtils.getPort()); jedisConnFactory.setHostName(SettingsUtils.getHost());