Java Jedis远程连接redis异常解决思路,异常描述:Could not get a resource from the pool && connect timed out

折腾一上午在windows server 2012 R2安装了redis windows 版本。本机cmd远程连接服务器上的redis没有问题。
但是java的jedis客户端连接远程的redis又又出现问题!!(整天除了惊喜就是满脑子的疑惑,还担心被导师说你怎么那么笨)

打开日志显示:

redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out
Caused by: java.net.SocketTimeoutException: connect timed out

Could not get a resource from the pool。
导致这个原因的有很多种,我采取了一一排查的措施。
以下的措施对寻找redis的远程连接的异常原因很有帮助。

1>:本机cmd再次连接远程的redis,顺利连接。排除了服务器防火墙以及端口没配置的问题。
2>:检查jedis的配置问题,特别注意pool = new JedisPool(config, host, port, time out, password);是否忘记了password;
time out的单位是毫秒!!!
3>:jedisPool的最大等待时间maxWaitMillis设置是否合理;
(表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException)
4>:用完的jedis实例是否回收了

按照以上四个步骤的顺序,依次排查

  • 本机能远程连接redis,排除第1种可能;
  • timeout设置合理(10000),注意到单位是毫秒,没有忘记密码,排除第2种可能
  • maxWaitMillis默认一直等待(-1L ),我设置maxWaitMillis为10000足够,排除第3中可能。
  • 用完redis之后发现没有返回资源
    找到问题的所在,于是增加如下代码,实现jedis实例返回连接池
try {
        } catch (Exception e) {
            // TODO: handle exception
            // 释放redis对象
            pool.returnBrokenResource(jedis);
        } finally {
            // 返还到连接池
             pool.returnResource(jedis);
        }

你可能感兴趣的:(javaweb)