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

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

2015-01-13 09:58 726 查看
异常描述:

[java] view
plaincopy

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] view
plaincopy

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] view
plaincopy

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

}

}

}

[java] view
plaincopy

转载自:<a href="http://www.iteye.com/topic/1122212">http://www.iteye.com/topic/1122212</a>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐