当前位置: 首页 > 知识库问答 >
问题:

无法从池中获取资源(SocketTimeoutExctive:)

单耘豪
2023-03-14

我正在运行多个工作线程(大约10个)来访问redis Q的数据。
我正在使用infinte timeout For Jedis客户端。

Jedis jedis = pool.getResource();
jedis.getClient().setTimeoutInfinite();  

但我仍然收到错误“无法从池中获取资源”。stacktrace如下所示。

redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
at redis.clients.util.Pool.getResource(Pool.java:22)
at Workers.Worker1.met1(Worker1.java:124)
at Workers.Worker1.work(Worker1.java:108)
at org.gearman.impl.worker.WorkerConnectionController$3.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)  

Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out
at redis.clients.jedis.Connection.connect(Connection.java:124)
at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:54)
at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1657)
at redis.clients.jedis.JedisPool$JedisFactory.makeObject(JedisPool.java:63)
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1188)
at redis.clients.util.Pool.getResource(Pool.java:20)
... 6 more  

Caused by: java.net.SocketTimeoutException: connect timed out
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at redis.clients.jedis.Connection.connect(Connection.java:119)
... 11 more

共有3个答案

鲁龙野
2023-03-14

这是经常发生还是偶尔发生?如果是偶然的,您可能需要检查连接池的大小。

如果使用的是config,则默认连接池大小为8。这对你的案子来说可能太小了。

JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(128);
jedisPool = new JedisPool(poolConfig, HOST, PORT, ...);
乐正乐湛
2023-03-14

根据Rick Hanlon的回答,如果在Spring Boot中使用Redis,也会引发此异常。

如果你使用的是Spring Boot,仅仅依赖Redis是不够的;您还需要从Redis手动下载并在您的机器上安装Redis。io,然后在Bash终端上运行它:

me@my_pc:/path/to/redis/dir$ ./src/redis-server ./redis.conf

运行服务器后,您需要在所有使用Redis的应用程序中添加相关行:

应用程序。属性

...
spring.redis.host: <yourhost> // usually localhost, but can also be on a LAN
spring.redis.port: <yourport> // usually 6379, but settable in redis.conf

应用程序。yml

...
spring:
  redis:
    host: <yourhost> // usually localhost, but can also be on a LAN
    port: <yourport> // usually 6379, but settable in redis.conf
郭星文
2023-03-14

我注意到,如果Redis没有运行,这个异常可以也将被抛出。只是提醒一下。

 类似资料:
  • Redis.Properties spring-redis.xml 代码 控制器

  • 大家好,我正在尝试使用Java建立redis服务器。我的Redis服务器是linux服务器,ulimit无限。 这里是创建连接的spring bean 公共类JedisService实现IJedisService,InitializingBean,DisposableBean{private JedisPool JedisPool;

  • 我每5分钟运行一次批处理作业,我不希望其他节点运行同一个作业,因此我使用绝地锁将一个对象锁定5分钟。这样,如果另一个节点试图运行同一个作业,它们就不会得到锁。工作是在获得锁后开始的,当我试图从Redis读取它时,我得到以下异常情况: 这是我的密码 spring启动应用程序。属性文件 作业在开始时执行以下代码以获得锁 之后,redis仓库类试图读取特定模式的值... 这就是我在日志中看到的完全例外。

  • 我成功地获得了20个请求的响应,但无法获得其余10个请求的响应。我面临的问题是,在前20个请求使用了20个连接之后,其余的10个请求无法从池中获得jedis连接,因此我得到以下例外情况: 我已经在网上搜索,但没有找到解决办法。有人能帮我吗?

  • 问题内容: 我已经在几个线程中看到了答案,但对我却没有解决,而且由于我的问题偶尔发生,因此问这个问题是否有人有任何想法。 我正在使用jedis版本2.8.0,Spring Data Redis版本1.7.5。和redis服务器版本2.8.4用于我们的缓存应用程序。 我有多个缓存保存在redis中,并且从redis获得请求。我正在使用spring数据redis API保存和获取数据。 所有保存和获取

  • 我使用的是jedis版本2.8.0和Spring Data redis版本1.7.5。和redis服务器版本2.8.4。 我有多个缓存得到保存在redis和获取请求是从redis完成的。我正在使用spring data redis API来保存和获取数据。 所有的save和get都可以正常工作,但偶尔geting会低于exception: 我的redis配置类: 有没有人面对过这个问题或者对此有任