在使用Jedis连接池模式下,比较常见的报错如下:

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

已华为云的分布式缓存服务(Redis)为例,首先确认实例是正常运行中状态,然后按以下步骤进行排查。

网络

1.        核对IP地址配置

检查jedis客户端配置的ip地址是否与缓存实例配置的子网地址一致,如果从公网访问,则检查是否与缓存实例绑定的弹性ip地址一致,不一致则修改一致后重试。

2.        测试网络

在客户端使用ping和Telnet小工具测试网络。

如果ping不通:

−          VPC内访问时,要求客户端与缓存实例的VPC相同,安全组相同或者缓存实例的安全组放开了6379端口访问。

−          公网访问时,要求缓存实例安全组放开36379端口访问。

−          如果IP地址可以ping通,telnet对应的端口不通,则尝试重启实例,如重启后仍未恢复,请联系华为云技术支持。

检查连接数是否超限

查看已建立的网络连接数是否超过JedisPool 配置的上限。如果连接数接近配置的上限值,则建议重启服务观察。如果明显没有接近,排除连接数超限可能。

Unix/Linux系统使用:

netstat-an | grep 6379 | grep ESTABLISHED | wc -l

Windows系统使用:

netstat-an | find "6379" | find "ESTABLISHED" /C

检查JedisPool连接池代码

如果连接数接近配置的上限,请分析是业务并发原因,或是没有正确使用JedisPool所致。

对于JedisPool连接池的操作,每次调用jedisPool.getResource()方法之后,需要调用jedisPool.returnResource()或者jedis.close()进行释放,优先使用close()方法。

客户端TIME_WAIT是否过多

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

如果TIME_WAIT过多,可以调整内核参数(/etc/sysctl.conf):

##当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击 
net.ipv4.tcp_syncookies = 1 
##允许将TIME-WAITsockets重新用于新的TCP连接 
net.ipv4.tcp_tw_reuse = 1 
##开启TCP连接中TIME-WAIT sockets的快速回收 
net.ipv4.tcp_tw_recycle = 1 
##修改系統默认的TIMEOUT时间 
net.ipv4.tcp_fin_timeout = 30

调整后重启生效:/sbin/sysctl -p

无法解决问题

如果按照以上原因排查之后还有问题,可以通过抓包并将异常时间点、异常信息以及抓包文件发送给华为云技术支持协助分析。

抓包可使用tcpdump工具,命令如下:

tcpdump-i eth0 tcp and port 6379 -n -nn -s 74 -w dump.pcap

公网访问时请将端口改成36379。

网卡名请改成实际的网卡名称。

详解Jedis连接池报错处理的更多相关文章

  1. redis运用连接池报错解决

    redis使用连接池报错解决redis使用十几小时就一直报异常 redis.clients.jedis.exceptions.JedisConnectionException: Could not g ...

  2. 连接池报错 Proxool Provider unable to load JAXP configurator file: proxool.xml

    上篇博文讲到简易配置 proxool 连接池:http://www.cnblogs.com/linnuo/p/7232380.html 由于把说明注释留在了 proxool.xml 配置文件里导致配置 ...

  3. 【转】java.sql.SQLException: statement is closed语句被关闭 druid连接池报错

    我之前在用druid 1.0.28版本也出现过这个问题, 现象就是: 报这个错的时候, 往往会出现在一条毫无错误的sql执行上报错,  sql放到数据库上执行或者单独拎出来执行完全没问题, 但是为什么 ...

  4. Druid连接池 报错:abandon connection原因分析

    问题现象:使用Druid的数据库连接池,在进行一个查询SQL的时候,抛出了异常: [2017-10-20 01:40:59.269 ERROR com.alibaba.druid.pool.Druid ...

  5. springjdbc使用c3p0连接池报错 java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector

    MyMaincom.test.sunc.MyMaintestMethod(com.test.sunc.MyMain)org.springframework.beans.factory.BeanCrea ...

  6. Jedis与Jedis连接池

    1.Jedis简介 实际开发中,我们需要用Redis的连接工具连接Redis然后操作Redis, 对于主流语言,Redis都提供了对应的客户端: https://redis.io/clients 2. ...

  7. Navicat连接mysql报错1251 -client does not support authentication protocol

    原文https://blog.csdn.net/qq_35654080/article/details/82588188 详解请参考https://blog.csdn.net/chszs/articl ...

  8. Springboot数据库连接池报错的解决办法

    Springboot数据库连接池报错的解决办法 这个异常通常在Linux服务器上会发生,原因是Linux系统会主动断开一个长时间没有通信的连接 那么我们的问题就是:数据库连接池长时间处于间歇状态,导致 ...

  9. Jedis连接池

    jedis是官方首选的java客户端开发包 Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java.C.C#.C++.php.Node.js.Go等. 在官方网站里列一些Ja ...

随机推荐

  1. java向邮箱发送消息失败!

    出现的错误如下: org.apache.commons.mail.EmailException: Sending the email to the following server failed : ...

  2. SQLlearn

  3. 【TOJ 3600】Fibonacci II (对数+斐波那契通项式)

    描述 2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列(f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i> ...

  4. CentOS7 yum命令

    1.yum 清理缓存 [hado@localhost /]# yum clean all [hado@localhost /]# rm -rf /var/cache/yum/*

  5. springboot-自定义起步依赖

    自定义起步依赖步骤: 1.  添加configuration注解文件 -          指定什么情况下加载配置 -          使用enableconfigurationProperties ...

  6. python2.7+PyQt4+eric6 界面开发环境配置

    1.安装环境: python2.7 PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x64.exe eric6-18.12.zip 2.安装步骤: 1.安装python2.7的过程略 2 ...

  7. 解决 LLVM 错误 fatal error: ‘csignal’ file not found

    /Users/exchen/Downloads/Unity-iPhone/Classes/main.mm:3:10: fatal error: ‘csignal’ file not found#inc ...

  8. React基本语法

    React 一.导入     0.局部安装 react 和 react-dom         npm install --save-dev react react-dom       1.react ...

  9. Postgresql 入门笔记

    引言     最近整理了一些PostgreSQL的 常用命令,仅供参考   1. 入门命令 # 重启数据库 $ service postgresql-9.5 restart # 登陆: $ psql ...

  10. day 15 装饰器

    装饰器(重点,难点) 开闭原则:             对功能的扩展开放            对代码的修改是封闭的 在目标函数前和后插入一段新的代码.不改变原来的代码 通用装饰器写法: # 存在的 ...