• redis使用问题一:Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool] with root cause


    本文使用的是spring-data-redis

    首先说下redis最简单得使用,除去配置。

    需要在你要使用得缓存得地方,例如mybatis在mapper.xml中加入:

    <cache eviction="LRU" type="cn.jbit.cache.RedisCache"/>

    由于是第一次使用redis,再调试代码得时候报错:Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool] with root cause

    无法获得redis的链接。

    方法1.重新配置了redis连接池得参数:需要按照自己缓存的数量而设置最大链接数。

    #最大空闲数,数据库连接的最大空闲时间。超过空闲数量,数据库连接将被标记为不可用,然后被释放。设为0表示无限制
    redis.maxIdle=50  
    #最大连接数:能够同时建立的“最大链接个数”#jedis的最大活跃连接数设为0表示无限制,这个属性就是高版本的maxTotal
    
    redis.maxActive=50
    #最大等待时间:单位ms
    #jedis池没有连接对象返回时,等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。
    #如果超过等待时间,则直接抛出JedisConnectionException
    redis.maxWait=1000  
    ##############################问题注解###############################
    注解:运行报错:Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisException:
     Could not get a resource from the pool] with root cause
    
    maxActive是最大激活连接数,这里取值为50,表示同时最多有50个数据连 接。maxIdle是最大的空闲连接数,这里取值为50,
    表示即使没有数据库连接时依然可以保持20空闲的连接,而不被清除,随时处于待命状态。MaxWait是最大等待秒钟数,这里取值-1,
    表示无限等待,直到超时为止,一般取值3000,表示3秒后超时。
    而自己开始的设置是:redis.maxIdle=10 redis.maxActive=50
    #########################################################################

    如果问题继续存在
     方法2.问题还是没解决,多次调试,发现链接资源没释放有关系,当然我的代码中是做了资源释放的。
    先看
    poolConfig
    <!-- redis数据源 -->
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">  
        <property name="maxIdle" value="${redis.maxIdle}" />  
        <property name="maxTotal" value="${redis.maxActive}" />
        <property name="maxWaitMillis" value="${redis.maxWait}" />  
        <property name="testOnBorrow" value="${redis.testOnBorrow}" />  
    </bean>
    redis.properties文件配置
    #最大链接数
    redis.maxTotal=100
    #最大空闲数,数据库连接的最大空闲时间。超过空闲数量,数据库连接将被标记为不可用,然后被释放。设为0表示无限制
    redis.maxIdle=20  
    ##jedis的最大活跃连接数设为0表示无限制
    redis.maxActive=100
    #最大等待时间:单位ms
    #jedis池没有连接对象返回时,等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。
    #如果超过等待时间,则直接抛出JedisConnectionException
    redis.maxWait=1000  
    
    #使用连接时,检测连接是否成功
    
    redis.testOnBorrow=true

    redis文件
    public void clear() {
       JedisConnection connection = null;
       try {
          connection = jedisConnectionFactory.getConnection();
          connection.flushDb();
          connection.flushAll();
          System.out.println("clear=redis======>");
       } catch (JedisConnectionException e) {
          connection.close();//释放链接
          e.printStackTrace();
       } finally {
          if (connection != null) {
             connection.close();//释放连接
          }
       }
    }
    问题的主要原因是使用连接池的链接后没有释放资源,当然开始我的代码就释放了使用的链接资源,但是还是会出现链接资源拿不到的情况。
    可能是因为异常没有释放链接资源,我这个getConnection()是使用的第三方静态注入依赖于ehcache,只需要在需要缓存的dao或者mapper
    加入注解,即可缓存并同步刷新最新数据。不需要在业务层手动的set,update,remove数据。
    如果是getResource()这种方式获取的redis链接,用returnToPool(jedis)或jedis.close()是可以解决问题的;
    最让我们忽略的原因就是你的redis是山寨版集成的,从新手博客上直接copy被坑的不要不要的。要么用spring boot集成的redis要么集成原生的。
    具体情况酌情处理


     
     
  • 相关阅读:
    打印杨辉三角
    插值排序
    各种冒泡排序法
    Linux系统命令符01
    2.1博客系统 |基于form组件和Ajax实现注册登录
    python面试笔试题,你都会了吗?快来复习
    1.2博客系统 |登录页| 验证码
    1.1博客系统| 表结构
    第五章:5.2面向对象-绑定方法和非绑定方法| 内置方法 |元类
    11.Django|中间件
  • 原文地址:https://www.cnblogs.com/zeussbook/p/9033222.html
Copyright © 2020-2023  润新知