读书人

Redis一个错误的解决方法错误描述:

发布时间: 2012-08-10 12:19:33 作者: rapoo

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

redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the poolat 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 objectat 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" value="5000"/>[/color]        <property name="maxIdle" value="5000"/>        <property name="maxWait" value="10000"/>        <property name="testOnBorrow" value="true"/></bean>


3、重现:

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);        }    }}

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();        [color=red]jedisConfig.setMaxActive(2);[/color]        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();        }    }}


}

public void insertActiveCode() {
JedisFactory factory = new JedisFactory();
Jedis jedis = factory.getJedisInstance();
//先向key java framework中存放三条数据
for (int i = 0; i < 10000; i++) {
jedis.rpush("activeCode", UUID.randomUUID().toString());
}
factory.release(jedis);
}

public static void main(String args[]) {
Test test = new Test();
test.insertActiveCode();
test.testThread();
}

class TestThread extends Thread {

@Override
public void run() {
JedisFactory factory = new JedisFactory();
Jedis jedis = factory.getJedisInstance();
String code = jedis.rpop("activeCode");
System.out.println("激活码:" + code);
System.out.println("长度:" + jedis.llen("activeCode"));
System.out.println("#############################");
factory.release(jedis);
}

}

}

/**
* 配合使用getJedisInstance方法后将jedis对象释放回连接池中
*
* @param jedis 使用完毕的Jedis对象
* @return true 释放成功;否则返回false
*/
public boolean release(Jedis jedis) {
if (jedisPool != null && jedis != null) {
jedisPool.returnResource(jedis);
return true;
}
return false;
}

}
}

public void insertActiveCode() {
JedisFactory factory = new JedisFactory();
Jedis jedis = factory.getJedisInstance();
//先向key java framework中存放三条数据
for (int i = 0; i < 10000; i++) {
jedis.rpush("activeCode", UUID.randomUUID().toString());
}
factory.release(jedis);
}

public static void main(String args[]) {
Test test = new Test();
test.insertActiveCode();
test.testThread();
}

class TestThread extends Thread {

@Override
public void run() {
JedisFactory factory = new JedisFactory();
Jedis jedis = factory.getJedisInstance();
String code = jedis.rpop("activeCode");
System.out.println("激活码:" + code);
System.out.println("长度:" + jedis.llen("activeCode"));
System.out.println("#############################");
factory.release(jedis);
}

}

}

/**
* 配合使用getJedisInstance方法后将jedis对象释放回连接池中
*
* @param jedis 使用完毕的Jedis对象
* @return true 释放成功;否则返回false
*/
public boolean release(Jedis jedis) {
if (jedisPool != null && jedis != null) {
jedisPool.returnResource(jedis);
return true;
}
return false;
}

}

我也比较懊恼,我做了调整之后,经测试偶尔也会出现此异常。 6 楼 jiasky 2012-05-16 dilaomi123 写道还有个问题,ShardedJedisPool 这个是如何用的?哪里有对应的资料啊,兄弟,我急需!非常感谢

而且我新增了一个redis实例之后问题依旧,初步怀疑是redis server的实现bug.

读书人网 >其他数据库

热点推荐