调用redis时出现java.lang.IllegalArgumentException: hostname can't be null这个错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调用redis时出现java.lang.IllegalArgumentException: hostname can't be null这个错相关的知识,希望对你有一定的参考价值。

Caused by: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool

参考技术A 当我们执行如下JedisPool类实例的getResource()时抛出can't get a resource异常。

异常代码如下:

redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool

at redis.clients.util.Pool.getResource(Pool.java:22)

分析:

redis.clients.util.Pool.getResource会从JedisPool实例池中返回一个可用的redis连接。分析源码可知JedisPool extends redis.clients.util.Pool<Jedis> .而Pool<T>是通过

commons-pool开源工具包中的org.apache.commons.pool.impl.GenericObjectPool来实现对Jedis实例的管理的。所以我们分析一下GenericObjectPool或许能找到答案。
首先看一下common-pool的api:http://commons.apache.org/pool/apidocs/index.html?org/apache/commons/pool/impl/GenericObjectPool.html。
其中三个重要个几个属性是:
MaxActive: 可用连接实例的最大数目,为负值时没有限制。
MaxIdle: 空闲连接实例的最大数目,为负值时没有限制。Idle的实例在使用前,通常会通过org.apache.commons.pool.BasePoolableObjectFactory<T>的activateObject()方法使其变得可用。
MaxWait: 等待可用连接的最大数目,单位毫秒(million seconds)。
(注:pool.getResource()方法实际调用的GenericObjectPool类borrowObject()方法,该方法会根据MaxWait变量值在没有可用连接(idle/active)时阻塞等待知道超时,具体含义参看api。)

也就是说当连接池中没有active/idle的连接时,会等待maxWait时间,如果等待超时还没有可用连接,则抛出Could not get a resource from the pool异常。所以为避免这样的错误,

我们应该根据程序实际情况合理设置这三个参数的值,同时在我们获取一个连接的程序方法中也应该合理的处理这个异常,当没有连接可用时,等待一段时间再获取也许是个比较好的选择。

heroku 中的 Django Redis 连接错误:写入套接字时出现错误 110。连接超时

【中文标题】heroku 中的 Django Redis 连接错误:写入套接字时出现错误 110。连接超时【英文标题】:Django Redis connection error in heroku: Error 110 while writing to socket. Connection timed out 【发布时间】:2020-02-13 06:14:57 【问题描述】:

我在 Heroku 上托管的 Django 项目中使用 Redis 进行缓存。

在 Redis 连接期间,我随机收到以下错误消息

写入套接字时出现错误 110。连接超时。

我正在使用以下版本的软件包

python-3.6.8 Django-2.2.2 redis-3.2.1 celery-4.3.0

另外,我正在使用 worker 访问 Redis(有时是 celery)。

有人可以建议我摆脱这个问题或任何其他对策来处理这个问题。

提前谢谢...

【问题讨论】:

我也遇到了同样的问题,有一段时间我在想这可能是由github.com/celery/kombu/issues/1019这个问题引起的。最近这个bug被修复了,我更新了kombu到4.6.3,但是问题依旧。 【参考方案1】:

这有几个可能的原因——最常见的情况是由于 redis 上的 maxmemory 设置太低而导致大量缓存逐出。使用 redis-cli stats 命令检查你的 redis 大小,看看你是否需要更多内存来 redis。

【讨论】:

以上是关于调用redis时出现java.lang.IllegalArgumentException: hostname can't be null这个错的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot Redis 使用 Redis 时出现连接被拒绝异常

redis在php运行时出现错误

致命异常:java.lang.IllegalStateException - 无法为 LinearLayout 创建层(仅在 Galaxy j4+、j6+ 中崩溃)

heroku 中的 Django Redis 连接错误:写入套接字时出现错误 110。连接超时

Android Studio“尚未附加片段”

从 config-server 获取 application.properties 时出现 Redis 连接失败错误