Apache Commons Pool 使用和分析

基于Apache Commons Pool 2.x

实例使用

public class User {  

 private String name;  
 private Integer age;  
 public String getName() {  
        return name;  
  }  
  public void setName(String name) {  
        this.name = name;  
  }  
  public Integer getAge() {  
        return age;  
  }  
  public void setAge(Integer age) {  
        this.age = age;  
  }  
}

UserFactory

public class UserFactory extends BasePooledObjectFactory<User> {  
    @Override  
  public User create() {  
        return new User();  
  }  

    @Override  
  public PooledObject<User> wrap(User obj) {  
        return new DefaultPooledObject<>(obj);  
  }  
}
public class ObjectPoolSample {  
    public static void main(String[] args) throws Exception {  
  // 创建对象工厂 
  UserFactory userObjectFactory = new UserFactory(); 
  // 创建对象池 
  ObjectPool<User> userObjectPool = new GenericObjectPool<>(userObjectFactory);  
  User user = userObjectPool.borrowObject();  
  System.out.println(user);  
  userObjectPool.returnObject(user);  
  User user1 = userObjectPool.borrowObject();  
  System.out.println(user1);  
  }  
}
// output: 同一个对象
// [email protected]
// [email protected]

流程分析

    对象的创建和销毁在一定程度上会消耗系统的资源,对于多数对象来说,没有必要利用对象池技术来进行对象的创建和管理。但是对于有些对象来说,其创建的代价还是比较昂贵的,比如线程、TCP 连接、数据库连接等对象,因此对象池技术还是有其存在的意义。
实现分析:
common-pool2 的三大部分:PooledObject,ObjectPool,PooledObjectFactory。
PooledObject: 对于池化的对象,包装了跟踪信息,例如状态信息。
ObjectPool:池化的基础接口
PooledObjectFactory:定义 ObjectPool 实例的生命周期方法的接口
ObjectPool中持有PooledObjectFactory,对具体对象的创建,销毁,激活等有PooledObjectFactory来操作。

borrowObject:从池中获取一个实例。
1、从LinkedBlockingDeque类型的pool对象使用pollFirst方法。
2、如果PooledObject为null,检查pool中的对象数量是否操作超过maxTotal,是的超过重复1,否则通过PooledObjectFactory的makeObject方法来创建对象。
3、createdCount创建的数量增加,将对象包装保存到ConcurrentHashMap类型的allObjects属性中。
4、更新PooledObject的状态信息。

returnObject:将对象返回到池中。
1、从ConcurrentHashMap类型的allObjects中获取池对象。
2、判断是否还存在对象。
3、标记对象返回的RETURN状态。
4、判断是getTestnReturn和对象的合法性,如果没有设置返回或者不合法,将destroy对O象,更新状态。
5、钝化对象,状态修改为IDLE。
6、判断是否达到对象池最大空闲数量或者池是否关闭,如果是将销毁,否则返回到对象池中,更新对象池的信息。

添加新评论