您的位置:首页 > 数据库 > Redis

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

2013-10-17 20:58 676 查看
异常描述: 

Java代码  


redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool  

    at redis.clients.util.Pool.getResource(Pool.java:22)  

    at com.derbysoft.jredis.longkeytest.BorrowObject.run(BorrowObject.java:22)  

    at java.lang.Thread.run(Thread.java:662)  

Caused by: java.util.NoSuchElementException: Timeout waiting for idle object  

    at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1134)  

    at redis.clients.util.Pool.getResource(Pool.java:20)  

    ... 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代码  


public class BorrowObject implements Runnable {  

    private ShardedJedisPool jedisPool;  

  

    public BorrowObject(ShardedJedisPool jedisPool) {  

        this.jedisPool = jedisPool;  

    }  

  

    @Override  

    public void run() {  

        ShardedJedis shardedJedis = null;  

        try {  

            shardedJedis = jedisPool.getResource();  

            String value = shardedJedis.hget("LONG_KEY_TEST:AA059E03E0AB7D806E6C351F87404B06C1190", "Roc El Pinar Aparthotel");  

            System.out.println(value);  

        } catch (Exception e) {  

            //logger.error(e);  

            e.printStackTrace();  

        } finally {  

            jedisPool.returnResource(shardedJedis);  

        }  

    }  

}  

Java代码  


public class BorrowObjectTest {  

    private ShardedJedisPool jedisPool = null;  

  

    public BorrowObjectTest() {  

        List<JedisShardInfo> jedisShardInfos = new ArrayList<JedisShardInfo>();  

        JedisShardInfo jedisShardInfo = new JedisShardInfo("192.168.1.112");  

        jedisShardInfo.setTimeout(1000000);  

        jedisShardInfos.add(jedisShardInfo);  

        jedisPool = new ShardedJedisPool(createJedisConfig(), jedisShardInfos);  

    }  

  

    private JedisPoolConfig createJedisConfig() {  

        JedisPoolConfig jedisConfig = new JedisPoolConfig();  

        jedisConfig.setMaxActive(2);  

        jedisConfig.setMaxIdle(2);  

        jedisConfig.setMaxWait(5);  

        jedisConfig.setTestOnBorrow(true);  

        return jedisConfig;  

    }  

  

    public static void main(String[] args) {  

        BorrowObjectTest borrowObjectTest = new BorrowObjectTest();  

        for (int i = 0; i < 300; i++) {  

            new Thread(new BorrowObject(borrowObjectTest.jedisPool)).start();  

        }  

    }  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐