redis---Redis一个异常的解决办法,异常描述:Could not get a resource from the pool

时间:2022-12-24 14:05:08
异常描述: 
Java代码  redis---Redis一个异常的解决办法,异常描述:Could not get a resource from the pool
  1. redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool  
  2.     at redis.clients.util.Pool.getResource(Pool.java:22)  
  3.     at com.derbysoft.jredis.longkeytest.BorrowObject.run(BorrowObject.java:22)  
  4.     at java.lang.Thread.run(Thread.java:662)  
  5. Caused by: java.util.NoSuchElementException: Timeout waiting for idle object  
  6.     at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1134)  
  7.     at redis.clients.util.Pool.getResource(Pool.java:20)  
  8.     ... 2 more  


1、产生原因:客户端去redis服务器拿连接(代码描述的是租用对象borrowObject)的时候,池中无可用连接,即池中所有连接被占用,且在等待时候设定的超时时间后还没拿到时,报出此异常。 

2、解决办法:调整JedisPoolConfig中maxActive为适合自己系统的阀值。 

<bean id="dataJedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">  
         <property name="maxActive" value="300"/>  
       <property name="maxIdle" value="100"/> 
        <property name="maxWait" value="10000"/> 
        <property name="testOnBorrow" value="true"/> 
</bean>
 

3、重现: 

Java代码  redis---Redis一个异常的解决办法,异常描述:Could not get a resource from the pool
  1. public class BorrowObject implements Runnable {  
  2.     private ShardedJedisPool jedisPool;  
  3.   
  4.     public BorrowObject(ShardedJedisPool jedisPool) {  
  5.         this.jedisPool = jedisPool;  
  6.     }  
  7.   
  8.     @Override  
  9.     public void run() {  
  10.         ShardedJedis shardedJedis = null;  
  11.         try {  
  12.             shardedJedis = jedisPool.getResource();  
  13.             String value = shardedJedis.hget("LONG_KEY_TEST:AA059E03E0AB7D806E6C351F87404B06C1190""Roc El Pinar Aparthotel");  
  14.             System.out.println(value);  
  15.         } catch (Exception e) {  
  16.             //logger.error(e);  
  17.             e.printStackTrace();  
  18.         } finally {  
  19.             jedisPool.returnResource(shardedJedis);  
  20.         }  
  21.     }  
  22. }  

Java代码  redis---Redis一个异常的解决办法,异常描述:Could not get a resource from the pool
  1. public class BorrowObjectTest {  
  2.     private ShardedJedisPool jedisPool = null;  
  3.   
  4.     public BorrowObjectTest() {  
  5.         List<JedisShardInfo> jedisShardInfos = new ArrayList<JedisShardInfo>();  
  6.         JedisShardInfo jedisShardInfo = new JedisShardInfo("192.168.1.112");  
  7.         jedisShardInfo.setTimeout(1000000);  
  8.         jedisShardInfos.add(jedisShardInfo);  
  9.         jedisPool = new ShardedJedisPool(createJedisConfig(), jedisShardInfos);  
  10.     }  
  11.   
  12.     private JedisPoolConfig createJedisConfig() {  
  13.         JedisPoolConfig jedisConfig = new JedisPoolConfig();  
  14.         jedisConfig.setMaxActive(2);  
  15.         jedisConfig.setMaxIdle(2);  
  16.         jedisConfig.setMaxWait(5);  
  17.         jedisConfig.setTestOnBorrow(true);  
  18.         return jedisConfig;  
  19.     }  
  20.   
  21.     public static void main(String[] args) {  
  22.         BorrowObjectTest borrowObjectTest = new BorrowObjectTest();  
  23.         for (int i = 0; i < 300; i++) {  
  24.             new Thread(new BorrowObject(borrowObjectTest.jedisPool)).start();  
  25.         }  
  26.     }  
  27. }