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