对于一些大对象,或者初始化过程较长的可复用的对象,我们如果每次都new对象出来,那么意味着会耗费大量的时间。

我们可以将这些对象缓存起来,当接口调用完毕后,不是销毁对象,当下次使用的时候,直接从对象池中拿出来即可。

下面以redis客户端举例,说明下连接池的基础实现。
commons-pool2,是常用的对象池工具包,实现了对象池中对象的整个生命周期的管理,同时还可以手动指定对象生命周期的调度阀值。
Jedis是java的redis客户端的实现,能够实现对redis单机以及切片集群的链接。使用起来还很方便。
下面使用Jedis和commons-pool实现客户端连接池的管理。

首先定义生成Jedis链接的工厂

 1 public class JedisPooledFactory extends BasePooledObjectFactory<Jedis> {
 2 
 3     //jedis server url
 4     private String url  = null;
 5 
 6     //redis server port
 7     private int    port = 6379;
 8 
 9     /**
10      * @param url
11      * @param port
12      */
13     public JedisPooledFactory(String url, int port) {
14         super();
15         this.url = url;
16         this.port = port;
17     }
18 
19     /** 
20      * @see org.apache.commons.pool2.BasePooledObjectFactory#create()
21      */
22     @Override
23     public Jedis create() throws Exception {
24         Assert.notNull(url);
25         return new Jedis(url, port);
26     }
27 
28     @Override
29     public boolean validateObject(PooledObject<Jedis> p) {
30         //if closed,validate error
31         if(!p.getObject().isConnected()){
32             return false;
33         }
34         return super.validateObject(p);
35     }
36 
37     @Override
38     public void destroyObject(PooledObject<Jedis> p) throws Exception {
39         // close the connection
40         p.getObject().close();
41         super.destroyObject(p);
42     }
43 
44     /**
45      * @see org.apache.commons.pool2.BasePooledObjectFactory#wrap(java.lang.Object)
46      */
47     @Override
48     public PooledObject<Jedis> wrap(Jedis obj) {
49         return new DefaultPooledObject<Jedis>(obj);
50     }
51 }
jedis连接工厂

相关文章: