gpt4 book ai didi

java - 从 JedisPool 获取资源时线程处于等待状态

转载 作者:IT王子 更新时间:2023-10-29 06:10:59 28 4
gpt4 key购买 nike

我正在使用 jedis 连接到 redis 服务器。 Redis ip 值配置在一个单独的文件中,我试图在初始化期间加载该文件

private static JedisPool pool;

public static void initRedisClient() throws Exception {
String redisConfigPath = "/conf/redis.properties";
Properties docsRedisProp = RedisUtils.loadProperties(redisConfigPath);
pool = new JedisPool(docsRedisProp.getProperty("redisserver"));
}
}

而我的mget从redis中获取多个key的方法如下

public static List<String> mgetDataFromRedisCache(String[] keys) throws CacheException {
Jedis jedisCon = null;
try {
jedisCon = getJedis();
jedisCon.select(1);
return jedisCon.mget(keys);
} catch (Exception e) {
LOGGER.warning("Exception while fetching data from Redis Client. EXCEPTION=" + e.getMessage());
e.printStackTrace();
} finally {
if (jedisCon != null) {
returnJedis(jedisCon);
}
}
return null;
}

当我在属性文件中提供了不正确的 ip 值时 - 访问它的请求线程正在等待很长一段时间。我的请求不应因池中资源不可用而停止。

我在这里附加了停滞线程的线程转储(即处于等待状态的线程)

###_http-nio-8443-exec-140" #104908 daemon prio=5 os_prio=0 tid=0x00007f247805f000 nid=0x4266 waiting on condition [0x00007f220a4df000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000006fe438408> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at org.apache.commons.pool2.impl.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:524)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:438)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:361)
at redis.clients.util.Pool.getResource(Pool.java:40)
at redis.clients.jedis.JedisPool.getResource(JedisPool.java:84)
at com.retail.store.RedisClient.getJedis(RedisClient.java:53)
at com.retail.store.RedisClient.mgetDataFromRedisCache(RedisClient.java:82)

我怎样才能做到这一点?任何帮助深表感谢。提前致谢:-)

最佳答案

redis 服务器 ip 在属性文件中维护,并在运行时加载它。

属性文件包含默认 ip。但是当我在我的开发设置中部署相同的内容时,redis ip 应该已经更改但我错过了这样做。我的开发设置无法连接给定的 ip。

Jedis有以下默认配置

maximimum active connections = 8

readtimeout = 2000

Maximum active connections 是池可以同时容纳的最大 Activity 连接数。

read time out 是在建立连接并准备好通过已建立的连接接收数据时设置的最长时间(以毫秒为单位)。

在我们的例子中,连接没有建立(对于前 8 个线程)并且它永远不会被终止 - 连接是 timeout 没有为这些连接设置。使 get 调用 redis 的其他线程现在进入停放 WAIT 状态。

通过设置以下池配置(即设置建立连接的最大等待时间)我们可以避免线程进入长时间等待状态

JedisPoolConfig jedisConfig = new JedisPoolConfig();
jedisConfig.setMaxWaitMillis(maxWaitInMillis);

关于java - 从 JedisPool 获取资源时线程处于等待状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44780577/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com