一、背景
对于使用面向对象语言开发软件的童鞋们都知道,对象是一个十分重要的概念,用Thinking in Java绪论里面的话说:一切皆是对象。
因为对象的重要性,所以在某些大型的应用系统中,对象会被频繁的创建并使用,这就会导致开发人员需要对系统的性能进行调优,特别是在系统耗时方法更是需要着重优化。幸好,有Apache这样一个组织,给奋斗在第一线的广大IT民工提供了这样一个好使的工具:common-pool。
Commons-pool是一个apache开源组织下的众多项目的一个,其原理很简单:创建一个对象池,将一定数量的对象缓存到这个对象池中,需要使用时直接从对象池中取出对象,使用完后将对象扔回到对象池中即可。下面介绍咱们今天的主角——common-pool。
二、common-pool组件简单说明
common-pool提供的对象池主要有两种:一种是带Key的对象池,这种带Key的对象池是把相同的池对象放在同一个池中,也就是说有多少个key就有多少个池;另一种是不带Key的对象池,这种对象池是把生产完全一致的对象放在同一个池中,但是有时候,单用对池内所有对象一视同仁的对象池,并不能解决的问题,例如:对于一组某些参数设置不同的同类对象——比如一堆指向不同地址的 java.net.URL对象或者一批代表不同语句的java.sql.PreparedStatement对象,用这样的方法池化,就有可能取出不合用的对象。
common-pool给带Key的对象池提供了三类对象:KeyedObjectPool、KeyedPoolableObjectFactory、KeyedObjectPoolFactory;给不带Key的对象池同样提供了三个接口:ObjectPool、PoolableObjectFactory、ObjectPoolFactory。这两组接口中的每个接口的功能都是相同的,即PoolableObjectFactory或KeyedPoolableObjectFactory用于管理被池化对象的产生,激活,挂起,检验和销毁;ObjectPool或KeyedObjectPool用于管理要被池化的对象的接触和归还,并通过PoolableObjectFactory完成相应的操作;ObjectPoolFactory或KeyedObjectPoolFactory作为对应ObjectPool或KeyedObjectPool的工厂,里边有createPool()方法,用于大量生成相同类型和设置的池。
三、common-pool实例
下面通过一个例子具体说明不带Key和带Key这两种对象池的区别:
1.实体类
2.不带Key的工厂类
3.带Key的工厂类
4.测试类
5.测试结果
>>>>>>0<<<<<<
对象池中处于闲置状态的对象:0
Object is activited….
取出的对象:com.zh.learn.common.pool.MyBaseObject@73a2335d
对象池中所有在用对象的数量:1
归还的对象:com.zh.learn.common.pool.MyBaseObject@73a2335d
>>>>>>1<<<<<<
对象池中处于闲置状态的对象:1
取出的对象:com.zh.learn.common.pool.MyBaseObject@73a2335d
对象池中所有在用对象的数量:1
>>>>>>2<<<<<<
对象池中处于闲置状态的对象:0
Object is activited….
取出的对象:com.zh.learn.common.pool.MyBaseObject@717da562
对象池中所有在用对象的数量:2
归还的对象:com.zh.learn.common.pool.MyBaseObject@717da562
>>>>>>3<<<<<<
对象池中处于闲置状态的对象:1
取出的对象:com.zh.learn.common.pool.MyBaseObject@717da562
对象池中所有在用对象的数量:2
>>>>>>4<<<<<<
对象池中处于闲置状态的对象:0
Object is activited….
取出的对象:com.zh.learn.common.pool.MyBaseObject@6ff4ff23
对象池中所有在用对象的数量:3
归还的对象:com.zh.learn.common.pool.MyBaseObject@6ff4ff23
不带Key的CommonPool执行结束
———————-
Object is activited….
Object is activited….
对象池中处于闲置状态的对象:2
A0>>>>com.zh.learn.common.pool.MyBaseObject@2b49959a<<<<1
B0>>>>com.zh.learn.common.pool.MyBaseObject@6bfcc7a9<<<<1
Object is activited….
C0>>>>com.zh.learn.common.pool.MyBaseObject@20985fa2<<<<1
归还的对象:com.zh.learn.common.pool.MyBaseObject@2b49959a,my_obj2,my_obj3
A1>>>>com.zh.learn.common.pool.MyBaseObject@2b49959a<<<<2
B1>>>>com.zh.learn.common.pool.MyBaseObject@6bfcc7a9<<<<2
C1>>>>com.zh.learn.common.pool.MyBaseObject@20985fa2<<<<2
归还的对象:com.zh.learn.common.pool.MyBaseObject@2b49959a,my_obj2,my_obj3
A2>>>>com.zh.learn.common.pool.MyBaseObject@2b49959a<<<<3
B2>>>>com.zh.learn.common.pool.MyBaseObject@6bfcc7a9<<<<3
C2>>>>com.zh.learn.common.pool.MyBaseObject@20985fa2<<<<3
归还的对象:com.zh.learn.common.pool.MyBaseObject@2b49959a,my_obj2,my_obj3
A3>>>>com.zh.learn.common.pool.MyBaseObject@2b49959a<<<<4
B3>>>>com.zh.learn.common.pool.MyBaseObject@6bfcc7a9<<<<4
C3>>>>com.zh.learn.common.pool.MyBaseObject@20985fa2<<<<4
Object is activited….
A4>>>>com.zh.learn.common.pool.MyBaseObject@73ae9565<<<<1
Object is activited….
B4>>>>com.zh.learn.common.pool.MyBaseObject@4ad25538<<<<1
Object is activited….
C4>>>>com.zh.learn.common.pool.MyBaseObject@36d8f5e8<<<<1
当前对象池中的所有对象:6
当前对象池中处于闲置状态的对象:0
带Key的CommonPool执行结束
———————-
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!