commons-pool2学习总结


创建有些对象的时候,非常消耗性能和时间,对象池技术是事先准备创建一些对象,放入一个池中,当需要的使用对象的时候,从池中获取,当用完之后就返回给池中。

这样可以减少实例对象创建的时间。而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();
	}

}


UserPoolFactory.java类


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









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值