在我的代码中,出于各种原因,我需要从
JedisCluster
实例获取连接。其他操作是使用 jedisCluster
实例发送命令:
val poolConfig = GenericObjectPoolConfig<Connection>().apply {
maxTotal = 128
maxIdle = 32
minIdle = 8
setMaxWait(Duration.ofMillis(1000))
blockWhenExhausted = true
}
...
val jedisCluster = JedisCluster(HostAndPort(host, port), jedisConfigBuilder.build(), maxAttempts, poolConfig)
...
val connection = jedisCluster.getConnectionFromSlot(slotNumber)
// run operations
// Now I want to release that connection, but not close it!
...
但是,连接没有返回到池中并且无法再次选择。关闭此连接不是一个好的选择,因为我仍然想从其他地方重用它。
我特别想把它放回泳池。
有什么想法如何以优雅的方式做到这一点吗?
我提供了 kotlin 代码,但任何 Java 中的示例也值得赞赏!
您可以使用单例模式处理连接。如果需要,您可以使用工厂模式来封装如何获取此连接。
看看我如何处理这个问题:
public final class RedisPoolConnection {
private static final int CONNECTION_TIMEOUT = 5000;
private static RedisPoolConexao instance;
private final JedisPool jedisPool;
private RedisPoolConexao(JedisPool jedisPool) {
this.jedisPool = jedisPool;
}
public static RedisPoolConnection getInstance(String hostUrl, int hostPort, String user, String password) {
if(Objects.isNull(instance)) {
final JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(120);
poolConfig.setMaxIdle(120);
poolConfig.setMinIdle(16);
poolConfig.setBlockWhenExhausted(true);
poolConfig.setMaxWait(Duration.ofSeconds(2));
try {
instance = new RedisPoolConexao(new JedisPool(poolConfig, hostUrl, hostPort, CONNECTION_TIMEOUT, StringUtils.firstNonBlank(user), password));
} catch(Exception e) {
// handle exception
}
}
return instance;
}
public JedisPool getJedisPool() {
return jedisPool;
}
}