JedisPool 记得 close

public class Test {  
      
    private static Pool<Jedis> pool;  
    static{  
        JedisPoolConfig config = new JedisPoolConfig();  
        //最大连接数  
        config.setMaxTotal(10);  
        //最大空闲连接数  
        config.setMaxIdle(5);  
        //连接耗尽时是否阻塞, false报异常,ture阻塞直到超时  
        config.setBlockWhenExhausted(false);  
        //在获取连接的时候检查有效性  
        config.setTestOnBorrow(true);  
        //master节点名称
        String masterName = "mymaster";  
        //Sentinel也支持集群  
        Set<String> sentinels = new HashSet<String>();    
        sentinels.add("10.110.20.23:26379");    
        pool = new JedisSentinelPool(masterName, sentinels,config);    
    }  
  
    public static void main(String[] args) {  
		for (int i = 0; i < 11; i++) {
			Jedis jedis = pool.getResource();
			System.out.println(
					(i + 1) + "," 
					+ jedis 
					+ ",activeNum:"+ pool.getNumActive() 
					+ ",idleNum:" + pool.getNumIdle()
					+ ",waiterNum:" + pool.getNumWaiters());
			//jedis.close();
		}
    }

 上述代码中,建立的连接池最大连接数是10,在main方法中,循环从连接池中获取链接,取11次,取得链接后,并不执行close()来关闭链接

执行结果:

1,redis.clients.jedis.Jedis@2f7c7260,activeNum:1,idleNum:0,waiterNum:0
2,redis.clients.jedis.Jedis@2d209079,activeNum:2,idleNum:0,waiterNum:0
3,redis.clients.jedis.Jedis@6bdf28bb,activeNum:3,idleNum:0,waiterNum:0
4,redis.clients.jedis.Jedis@6b71769e,activeNum:4,idleNum:0,waiterNum:0
5,redis.clients.jedis.Jedis@2752f6e2,activeNum:5,idleNum:0,waiterNum:0
6,redis.clients.jedis.Jedis@e580929,activeNum:6,idleNum:0,waiterNum:0
7,redis.clients.jedis.Jedis@1cd072a9,activeNum:7,idleNum:0,waiterNum:0
8,redis.clients.jedis.Jedis@7c75222b,activeNum:8,idleNum:0,waiterNum:0
9,redis.clients.jedis.Jedis@4c203ea1,activeNum:9,idleNum:0,waiterNum:0
10,redis.clients.jedis.Jedis@27f674d,activeNum:10,idleNum:0,waiterNum:0
Exception in thread "main" redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool
	at redis.clients.util.Pool.getResource(Pool.java:51)
	at redis.clients.jedis.JedisSentinelPool.getResource(JedisSentinelPool.java:209)
	at redis.clients.jedis.JedisSentinelPool.getResource(JedisSentinelPool.java:17)
	at Test.main(Test.java:41)
Caused by: java.util.NoSuchElementException: Pool exhausted
	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:464)
	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363)
	at redis.clients.util.Pool.getResource(Pool.java:49)
	... 3 more

可以看到,每次取出的链接都是新的链接, 并且取一次,连接池的活动连接数activeNum增一,第11次取的时候,抛出了连接池耗尽( Pool exhausted)的错误。

将上述代码的main()稍作调整,取出链接后,执行close()操作,调整后代码如下:

 public static void main(String[] args) {  

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

Jedis jedis = pool.getResource();

System.out.println(

(i + 1) + "," 

+ jedis 

+ ",activeNum:"+ pool.getNumActive() 

+ ",idleNum:" + pool.getNumIdle()

+ ",waiterNum:" + pool.getNumWaiters());

jedis.close();

}

再次运行,结果如下:

1,redis.clients.jedis.Jedis@2f7c7260,activeNum:1,idleNum:0,waiterNum:0

2,redis.clients.jedis.Jedis@2f7c7260,activeNum:1,idleNum:0,waiterNum:0

3,redis.clients.jedis.Jedis@2f7c7260,activeNum:1,idleNum:0,waiterNum:0

4,redis.clients.jedis.Jedis@2f7c7260,activeNum:1,idleNum:0,waiterNum:0

5,redis.clients.jedis.Jedis@2f7c7260,activeNum:1,idleNum:0,waiterNum:0

6,redis.clients.jedis.Jedis@2f7c7260,activeNum:1,idleNum:0,waiterNum:0

7,redis.clients.jedis.Jedis@2f7c7260,activeNum:1,idleNum:0,waiterNum:0

8,redis.clients.jedis.Jedis@2f7c7260,activeNum:1,idleNum:0,waiterNum:0

9,redis.clients.jedis.Jedis@2f7c7260,activeNum:1,idleNum:0,waiterNum:0

10,redis.clients.jedis.Jedis@2f7c7260,activeNum:1,idleNum:0,waiterNum:0

11,redis.clients.jedis.Jedis@2f7c7260,activeNum:1,idleNum:0,waiterNum:0

-----------------------------------------------

活动连接数始终只有一个,并且每次取出的都是同一个链接(redis.clients.jedis.Jedis@2f7c7260)。

猜你喜欢

转载自huangqiqing123.iteye.com/blog/2396835