全部产品
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 钉钉智能硬件
云数据库 Redis 版

Jedis 连接池错误

更新时间:2017-06-07 13:26:11

使用 Jedis 连接池模式容易遇到无法获取连接池的错误如下所示。

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

可以根据以以下几种原因进行分类排查。

网络检查

首先检查是否网络问题,可以通过telnet host 6379进行简单测试,连上之后auth 密码回车查看是否返回+OK\r\n,如果能够正确返回继续检查ping请求或者读写请求是否正常返回,操作多次排查网络问题影响。

JedisPool 连接数设置检查

JedisPool 使用的时候需要进行连接池的设置,用户在超过 MaxTotal 连接数的时候也会出现获取不到连接池的情况,这个时候可以在访问客户端上通过netstat -an | grep 6379 | grep EST | wc -l查看链接的客户端链接数目,并且比较这个数目和 JedisPool 配置的 MaxTotal 的值,如果没有明显超过或者接近就可以排除 JedisPool 连接池配置的影响。

JedisPool 连接池代码检查

对于 JedisPool 连接池的操作,每次 getResource 之后需要调用 returnResource 或者 close 进行归还,可以查看代码是否是正确使用,代码示例如下:

  1. JedisPoolConfig config = new JedisPoolConfig();
  2. //最大空闲连接数, 应用自己评估,不要超过ApsaraDB for Redis每个实例最大的连接数
  3. config.setMaxIdle(200);
  4. //最大连接数, 应用自己评估,不要超过ApsaraDB for Redis每个实例最大的连接数
  5. config.setMaxTotal(300);
  6. config.setTestOnBorrow(false);
  7. config.setTestOnReturn(false);
  8. String host = "*.aliyuncs.com";
  9. String password = "密码";
  10. JedisPool pool = new JedisPool(config, host, 6379, 3000, password);
  11. Jedis jedis = null;
  12. try {
  13. jedis = pool.getResource();
  14. /// ... do stuff here ... for example
  15. jedis.set("foo", "bar");
  16. String foobar = jedis.get("foo");
  17. jedis.zadd("sose", 0, "car");
  18. jedis.zadd("sose", 0, "bike");
  19. Set<String> sose = jedis.zrange("sose", 0, -1);
  20. } finally {
  21. if (jedis != null) {
  22. jedis.close();
  23. }
  24. }
  25. /// ... when closing your application:
  26. pool.destroy();

检查是否发生 nf_conntrack 丢包

通过 dmesg 检查客户端是否有异常。

  1. nf_conntrack: table full, dropping packet

如果发生 nf_conntract 丢包可以修改设置 sysctl -w net.netfilter.nf_conntrack_max=120000

检查是否 TIME_WAIT 问题

通过ss -s查看 time wait 链接是否过多。

如果 TIME_WAIT 过多可以修改以下参数:

  1. sysctl -w net.ipv4.tcp_max_tw_buckets=180000
  2. sysctl -w net.ipv4.tcp_tw_recycle=1

检查是否 DNS 解析问题

通过在 /etc/hosts 文件直接绑定 host 地址,绑定完成之后查看问题是否还存在,如果还存在则不是 DNS 解析问题。

  1. 192.168.1.1 *.redis.rds.aliyuncs.com

需要帮助

如果按照上面排查之后还有问题可以通过抓包并将报错时间点、报错信息、抓包文件发送给阿里云售后同学进行分析。抓包命令为sudo tcpdump -i eth0 tcp and port 6379 -n -nn -s 74 -w redis.cap

本文导读目录