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)。