本文共 1082 字,大约阅读时间需要 3 分钟。
服务器报redis 异常,Could not return the resource to the pool,关闭服务器重启后依旧很快挂掉,最终定位到代码上面,原因是redis的关闭导致
错误代码如下:
public Long del(String pName, String key) { Long keyRemovedCount=-1L; if (key==null) return null; Jedis jedis = null;// try(Jedis jedis = jedisPool.getResource()) { try{ jedis = jedisPool.getResource();// ShardedJedis jedis = this.shardedJedisPool.getMasterJedisPool().getResource();;// LOGGER.info("------delete ------jedis key:"+pName+key); keyRemovedCount = jedis.del(pName+key); jedis.close(); } catch (Exception e) { LOGGER.error("jedis set error:", e); } finally{ try{ jedis.close(); } catch(Exception ee){} } return keyRemovedCount; }jedis的2次close导致,两次送还句柄,如果产生并发量大时会出问题。
正确的释放资源的方式如下,仅支持jdk1.7(含1.7)以上版本
public Long del(String pName, String key) { Long keyRemovedCount=-1L; if (key==null) return null; try(Jedis jedis = jedisPool.getResource()) { keyRemovedCount = jedis.del(pName+key); } catch (Exception e) { LOGGER.error("jedis set error:", e); } return keyRemovedCount; }在try()中加入Jedis jedis = jedisPool.getResource(),这样会自动释放资源
转载地址:http://ghadi.baihongyu.com/