关于配置Java redis 连接池报错的问题

俊俏的俊 发表于: 2021-02-27   最后更新时间: 2021-03-01 14:02:15   179 游览
0

有一个高频繁查询redis数据的接口 用java 给redis配置连接池 运行一段时间后,就会报Could not get a resource from the pool,redis查询接口调用非常频繁 每运行了一段时间后就会报错 请教大佬这是什么原因

nested exception is redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool] with root cause
java.util.NoSuchElementException: Timeout waiting for idle object

Java连接池的配置

public class RedisPoolUtil {
    private static JedisPool pool = null;
    /**
     * 获取jedis连接池
     * */
    public static JedisPool getPool()
    {
        if(pool == null)
        {
            //创建jedis连接池配置
            JedisPoolConfig config = new JedisPoolConfig();
            //最大连接数
            config.setMaxTotal(900);
            config.setMaxWaitMillis(3000);
            config.setTestOnBorrow(true);
            //最大空闲连接
            config.setMaxIdle(50);
            //创建redis连接池
            pool = new JedisPool(config,"127.0.0.1",26379,3000,"******",10);
        }
        return pool;
    }
    /**
     * 获取jedis连接
     * */
    public static Jedis getConn()
    {
        return getPool().getResource();
    }

}

Java取redis数据的接口

    public JSONObject queryRedisByKey(Integer flag, String key, Integer db) {
        Jedis jedis = RedisPoolUtil.getConn();
        JSONObject json = new JSONObject();
        switch (flag){
            case 1: //String
                //判断是否存在key 存在查询返回 不存在返回失败
                if (jedis.exists(key)) {
                    try {
                        String obj = jedis.get(key);
                        json.put("status", 0);
                        json.put("msg", "查询成功");
                        json.put("data", obj);
                        return Gsons.data(json);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    finally {
                        if (jedis != null)
                            jedis.close();
                    }
                } else {
                    json.put("status", 1);
                    json.put("msg", "查询失败");
                    return Gsons.data(json);
                }
                break;
                }
                }

已经尝试过把setMaxTotalsetTestOnBorrow加上了,仍然没有解决问题。

请大佬帮忙看下哪里的问题,非常感谢。



发表于 1月前

  • 简单读了一下,你的

    jedis.close();
    

    如果条件为else的时候,没有关闭。

    • 1、把JedisPool升到最新的版本(听说老版本有bug)
      2、代码依然不严谨,try包裹业务,保障无论什么业务都释放jedis。

      Jedis jedis = RedisPoolUtil.getConn();
      JSONObject json = new JSONObject();
      try{
          switch (flag)
          ...
      } catch (Exception e) {
          e.printStackTrace();
      }
      finally {
          if (jedis != null)
              jedis.close();
      }
      
      • 找不到想要的答案?

        我要提问
        相关