gpt4 book ai didi

java - 绝地武士获取数据 : JedisConnectionFailureException iterating a section of code over long period of time

转载 作者:可可西里 更新时间:2023-11-01 11:20:32 32 4
gpt4 key购买 nike

所以我有一个代码可以使用 Jedis 客户端从 Redis 获取值。但有一次,Redis 处于最大连接状态,并且抛出了这些异常:

org.springframework.data.redis.RedisConnectionFailureException
Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:140)
at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.getConnection(JedisConnectionFactory.java:229)
...
org.springframework.data.redis.RedisConnectionFailureException
java.net.SocketTimeoutException: Read timed out; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out
at org.springframework.data.redis.connection.jedis.JedisExceptionConverter.convert(JedisExceptionConverter.java:47)
at org.springframework.data.redis.connection.jedis.JedisExceptionConverter.convert(JedisExceptionConverter.java:36)
...
org.springframework.data.redis.RedisConnectionFailureException
Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:140)
at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.getConnection(JedisConnectionFactory.java:229)

当我检查此场景的 AppDynamics 分析时,我看到了一些调用在很长一段时间(1772 秒)内的一些迭代。调用显示在片段中。

First Snip (iteration of Thread:sleep and BinaryJedis:exists

Second Snip (iteration of Thread:sleep and BinaryJedis:exists

谁能解释一下这里发生了什么?还有为什么Jedis在超时设置(500ms)后没有停止?我可以长期防止这种情况发生吗?

这就是我对 Jedis 的 Bean 定义:

<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:host-name="100.90.80.70" p:port="6382" p:timeout="500" p:use-pool="true" p:poolConfig-ref="jedisPoolConfig" p:database="3" />

<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="1000" />
<property name="maxIdle" value="10" />
<property name="maxWaitMillis" value="500" />
<property name="testOnBorrow" value="true" />
<property name="testOnReturn" value="true" />
<property name="testWhileIdle" value="true" />
<property name="numTestsPerEvictionRun" value="10" />
</bean>

最佳答案

我不熟悉 AppDynamics 输出。我假设这是线程及其 sleep 时间的累积 View 。所以线程得到重用,所以 sleep 时间加起来。在某些情况下,线程直接获得连接,无需任何等待,而在另一个调用中,线程必须等待直到可以提供连接。等待时间取决于连接何时可用或达到等待限制。

让我们举一个实际的例子:

您的屏幕截图显示了一个线程,它等待了 172ms。假设 sleep 仅在 Jedis/Redis 调用路径中被调用,Thread 总共等待 172ms 以获得连接。

等待 530ms 的另一个线程在我看来好像第一次尝试建立连接不成功(这解释了第一个 500ms),然后在第二次尝试,它必须等待 30ms。也可能是它等待了 2 倍 265ms

旁注:

超过 1000 个连接会严重限制可扩展性。 Spring Data Redis 还支持其他不需要池但使用较少连接的驱动程序(请参阅 Spring Data Redis Connectorshere)。

关于java - 绝地武士获取数据 : JedisConnectionFailureException iterating a section of code over long period of time,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36871506/

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