错误详情
redis.clients.jedis.exceptions.JedisExhaustedPoolException: Could not get a resource since the pool is exhausted
at redis.clients.jedis.util.Pool.getResource(Pool.java:78)
at redis.clients.jedis.ShardedJedisPool.getResource(ShardedJedisPool.java:42)
面向百度编程的我,二话不说就把错误ctrl+c and ctrl+v进搜索框,一输入,看了几篇文章,原因主要有几个
- redis服务本身有问题
- redis连接池使用完以后没有及时释放,导致链接不够用
解决
redis服务是集团搭建的,所以首先排除了redis本身的问题,查看日志一开始看到报错都在登录消息里,以为单纯的只是登录消息量太大,导致redis不够用了。没重视,重新部署一遍代码上线问题初步解决。
第二次线上又报错了,出了一身汗,这次在看了一遍网上的帖子,如果是try 里面使用jedis的话,一定要自己释放连接。再次ctrl+f搜索代码中自己redis操作的地方,这次发现了一个大问题
try {
ShardedJedis redis = poolMaster.getResource();
redis.hset(getSetHotCornerKey(day), xxx, 1 + "");
redis.expire(getSetHotCornerKey(day), REDIS_EXPIRE_SECONDS);
} catch (Exception e) {
log.error("xxx uid:{},exception:{}", uid, e);
}
没有释放连接啊啊啊啊,真想给自己一个大嘴巴子
try(ShardedJedis redis = poolMaster.getResource()) {
redis.hset(getSetHotCornerKey(day), xxx, 1 + "");
redis.expire(getSetHotCornerKey(day), REDIS_EXPIRE_SECONDS);
} catch (Exception e) {
log.error("xxx uid:{},exception:{}", uid, e);
}
这样就可以自己释放连接了。明天发线上观察观察