深入浅出commoms-pool2对象池
apache-commoms-pool2 研究笔记。
什么是对象池
apache-commoms-pool2主要结构
GenericObjectPool
GenericKeyedObjectPool
SoftReferenceObjectPool
ProxiedKeyedObjectPool和ProxiedObjectPool
- 结束语
什么是对象池
高性能编程开发中有一项特别重要的技术,就是缓存技术。缓存技术几乎应用于方方面面,以提升程序的整体性能。而java的对象池就是缓存技术的一种。它对高并发环境下程序的性能提升有很大帮助。如我们所知的,一般的对象的创建耗时,在纳秒级的处理速度的cpu面前其实不值一提。但是,有一些复杂数据结构的大对象,比如数据库的链接对象,他的创建相对就比较耗费性能。如果频繁的创建此类对象,那么无论从时间还是空间角度,都是极大的浪费。于是乎,有了对象池这种专门来管理大对象的管理部门。大对象不在由其他人肆意的创建了,而是有对象池下属的工厂类来负责,再由对象池来提供出借。对象池主要提供出借,归还服务和对象的生命周期管理,保证有足够的对象能够被借出,同时不会有过多的空闲对象来白白浪费存储空间。
apache-commoms-pool2主要结构
GenericObjectPool
这是最普通,最基础的一个对象池实现。适合最常见的,最普通的场景。我们尝试用httpclient对象来造一个连接池。这样我们可以提高使用httpclient的并发性能。首先需要定义一个工厂类,实现PooledObjectFactory然后看到里面的方法。主要的是创建makeObject和销毁destroyObject。validateObject方法用来验证对象是否有用。当我们向对象池借对象的时候,对象池会先调用validateObject验证对象是否有用。毕竟,它需要保证借出的对象都是有用的。activateObject激活对象,类似初始化方法。passivateObject钝化对象,意味着释放资源,反初始化。这两个方法看情况而定,不用空着也没事。
package commons.pool;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.PooledObjectFactory;
import org.apache.commons.pool2.impl.DefaultPooledObject;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
/**<h1> HTTPClient工厂 </h1>
* <p>
* <b>描述:</b>
* 为对象池创建,激活,释放,销毁对象等 <br>
*
* </p>
* @author 萧影秋
* @version 1.0 2016年09月09日 星期五 上午 11点03分00秒
*/
public class HttpClientFactory implements PooledObjectFactory<HttpClient> {
@Override
public PooledObject<HttpClient> makeObject()