对于一些大对象,或者初始化过程较长的可复用的对象,我们如果每次都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 }