创建有些对象的时候,非常消耗性能和时间,对象池技术是事先准备创建一些对象,放入一个池中,当需要的使用对象的时候,从池中获取,当用完之后就返回给池中。
这样可以减少实例对象创建的时间。而commons-pool2 是实现对象池的一个框架。创建对象池其主要有三部组成:
组成
- ObjectPool:实现对对象存取和状态管理的池实现;如:线程池、数据库连接池
- PooledObject:池化对象,是需要放到ObjectPool对象的一个包装类。添加了一些附加的信息,比如说状态信息,创建时间,激活时间,关闭时间等
- PooledObjectFactory:工厂类,负责具体对象的创建、初始化,对象状态的销毁和验证
流程是: PooledObjectFactory工厂类创建对象PooledObject 放入到ObjectPool 中被调用。
具体是:
当对象池ObjectPool 中没有可以足够的对象可以用的时候,并且还没有达到可以创建的最大对象数的时候,则工厂类PooledObjectFactory调用makeObject()方法创建一个实例PooledObject。供objectPool.borrowObject()获取对象。
当使用完之后,通过 objectPool.returnObject(obj)返回对象池中。
具体实例: user.java类
package com.eastcom.first.spark.pool;
public class User {
// 姓名
private String name;
// 年龄
private int age;
// 身高
private String height;
public User(String name, int age, String height) {
super();
this.name = name;
this.age = age;
this.height = height;
}
@Override
public String toString() {
StringBuilder str = new StringBuilder(super.toString());
str.append(" ");
str.append("name:" + name);
str.append(",age:" + age);
str.append(",height:" + height);
return str.toString();
}
}
package com.eastcom.first.spark.pool;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.PooledObjectFactory;
import org.apache.commons.pool2.impl.DefaultPooledObject;
public class UserPoolFactory implements PooledObjectFactory<User> {
/**
* 当对象池中没有多余的对象可以用的时候,调用此方法。
*/
@Override
public PooledObject<User> makeObject() throws Exception {
System.out.println("make Object");
User user = new User(Thread.currentThread().getName(), 26, "178cm");
return new DefaultPooledObject<User>(user);
}
@Override
public void destroyObject(PooledObject<User> arg0) throws Exception {
System.out.println("destroy Object");
User user = arg0.getObject();
user = null;
}
/**
* 功能描述:判断资源对象是否有效,有效返回 true,无效返回 false
*
* 什么时候会调用此方法
*
* 1:从资源池中获取资源的时候,参数 testOnBorrow 或者 testOnCreate 中有一个 配置 为 true 时,
*
* 则调用 factory.validateObject() 方法.
*
* 2:将资源返还给资源池的时候,参数 testOnReturn,配置为 true 时,调用此方法.
*
* 3:资源回收线程,回收资源的时候,参数 testWhileIdle,配置为 true 时,调用此方法.
*/
@Override
public boolean validateObject(PooledObject<User> arg0) {
System.out.println("validate Object");
return true;
}
/**
* 功能描述:激活资源对象
*
* 什么时候会调用此方法
*
* 1:从资源池中获取资源的时候
*
* 2:资源回收线程,回收资源的时候,根据配置的 testWhileIdle 参数,
*
* 判断 是否执行 factory.activateObject()方法,true 执行,false 不执行
*
* @param arg0
*/
@Override
public void activateObject(PooledObject<User> arg0) throws Exception {
System.out.println("activate Object");
}
/**
* 功能描述:钝化资源对象
*
* 什么时候会调用此方法
*
* 1:将资源返还给资源池时,调用此方法。
*
*/
@Override
public void passivateObject(PooledObject<User> arg0) throws Exception {
System.out.println("passivate Object");
}
}
PoolTest.java类
package com.eastcom.first.spark.pool;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
public class PoolTest {
public static void main(String[] args) throws Exception {
// 工厂
UserPoolFactory factory = new UserPoolFactory();
// 资源池配置
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
poolConfig.setMinIdle(2);
// 创建资源池
GenericObjectPool<User> objectPool = new GenericObjectPool<User>(factory, poolConfig);
for (int i = 0; i < 10; i++) { // Thread.sleep(1000); // 获取资源对象 User
User user1 = objectPool.borrowObject(); // 将获取的资源对象,返还给资源池
objectPool.returnObject(user1); // 输出资源对象 System.out.println(user);
System.out.println();
}
for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
@Override
public void run() {
try {
User user = objectPool.borrowObject();// 注意,如果对象池没有空余的对象,那么这里会block,可以设置block的超时时间
System.out.println(user);
Thread.sleep(1000);
objectPool.returnObject(user);// 申请的资源用完了记得归还,不然其他人要申请时可能就没有资源用了
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
}
}
make Object
activate Object
passivate Object
activate Object
passivate Object
activate Object
passivate Object
activate Object
passivate Object
activate Object
passivate Object
activate Object
passivate Object
activate Object
passivate Object
activate Object
passivate Object
activate Object
passivate Object
activate Object
passivate Object
参考链接:http://blog.youkuaiyun.com/liang_love_java/article/details/50511012
参考链接:https://github.com/jackson18/commons-pool2-Demo
参考链接:https://github.com/aplugeek/Common-Pool2/tree/master/src/main/java/com/inspur/tax/connectpool