commons-pool对象池实现原理及使用(二)

本文通过实例代码深入探讨了Apache Commons-pool库的使用,包括自定义对象池类MyObjectPool、池对象MyObject及其工厂类MyPoolableObjectFactory。通过运行代码展示对象池的工作流程。
摘要由CSDN通过智能技术生成

纸上得来终觉浅,绝知此事要躬行,我们用Commons-pool-1.6来写一个我们自己的对象池。

类MyObject 为池对象

类MyPoolableObjectFactory 为池对象工厂

类MyObjectPool封装的一个对象池

/**
 * 
 * @author yujie.wang
 * 测试类
 */
public class MyObject {
	private String name;
	// true 表明对象可用,false表明当前对象不可用
	private boolean isValidate;
	
	private String state ;
	
	private boolean passivateFlag;
	
	public MyObject(String name, boolean isValidate,String state){
		this.name = name;
		this.isValidate = isValidate;
		this.state = state;
	}

	public void sayHello(){
		System.out.println(name + " say hello world");
	}
	
	public boolean isPassivateFlag() {
		return passivateFlag;
	}

	public void setPassivateFlag(boolean passivateFlag) {
		this.passivateFlag = passivateFlag;
	}

	public String getState() {
		return state;
	}

	public void setState(String state) {
		this.state = state;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public boolean isValidate() {
		return isValidate;
	}

	public void setValidate(boolean isValidate) {
		this.isValidate = isValidate;
	}
}


/**
 * 
 * @author yujie.wang
 *	池对象工厂 对象池会调用这个工厂操作我们的对象 比如创建 激活 验证 销毁 钝化
 */
public class MyPoolableObjectFactory extends BasePoolableObjectFactory<MyObject>{

	@Override
	public void activateObject(MyObject arg0) throws Exception {
		// TODO Auto-generated method stub
		arg0.setState("i am ok");
		arg0.setValidate(true);
		System.out.println(arg0.getName() + " 对象已经激活");
	}

	/**
	 * 归还对象时 如果调用validateObject 验证对象失败,或者连接池被关闭,
	 * 又或者归还对象时连接池中空闲的对象数量大于等于MaxIdel
	 * 若符合上述三种情况之一 都会调用这个方法销毁对象
	 * 
	 */
	@Override
	public void destroyObject(MyObject arg0) throws Exception {
		// TODO Auto-generated method stub
		arg0.setState("i am done");
		arg0.setValidate(false);
		System.out.println(arg0.getName() + " 对象已经销毁");
	}
	/**
	 * 对象池调用该方法 创建一个对象
	 */
	@Override
	public MyObject makeObject() throws Exception {
		// TODO Auto-generated method stub
		MyObject obj = new MyObject("new obj", false, " i am new");
		return obj;
	}

	/**
	 * 归还对象时 钝化对象 比如某些对象用完之后需要休眠一段时间
	 */
	@Override
	public void passivateObject(MyObject arg0) throws Exception {
		// TODO Auto-generated method stub
		arg0.setPassivateFlag(true);
		System.out.println(arg0.getName() + " 钝化完成");
	}

	/**
	 * testOnBorrow设置为true时,创建对象时调用该方法验证对象的有效性,
	 * 如果无效直接抛出异常throw new Exception("ValidateObject failed");
	 * testOnReturn设置为true时,归还对象时 验证对象是否还有效 比如连接是否还在,
	 * 如果无效了则不往对象池中放对象。
	 */
	@Override
	public boolean validateObject(MyObject arg0) {
		// TODO Auto-generated method stub
		System.out.println(arg0.getName() + " 验证对象 "+ arg0.isValidate());
		return arg0.isValidate() ? true :false;
	}
}

/**
 * 
 * @author yujie.wang
 * 直接使用GenericObjectPool 来封装一个对象池组件
 */
public class MyObjectPool {
	private GenericObjectPool<MyObject> pool;
	
	public MyObjectPool(PoolableObjectFactory<MyObject> factory,MyObjectConfig config){
		pool = new GenericObjectPool<MyObject>(factory, config);
	}
	/**
	 * 从对象池中返回一个对象
	 * @return
	 */
	public MyObject borrowObject(){
		try {
			return pool.borrowObject();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	/**
	 * 将已经使用过的对象返还到对象池
	 * @param obj
	 */
	public void returnObject(MyObject obj){
		try {
			pool.returnObject(obj);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 使对象池中的obj对象无效
	 * @param obj
	 */
	public void invalidateObject(MyObject obj){
		try {
			//内部调用了池对象工程的destroyObject方法
			pool.invalidateObject(obj);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 关闭连接池
	 */
	public void destory(){
		try {
			pool.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	//这里通过继承GenericObjectPool.Config 这个内部类 来操作相关参数
	public static class MyObjectConfig extends GenericObjectPool.Config{ 
		
		public MyObjectConfig(){
			setTestWhileIdle(true);
			setMinEvictableIdleTimeMillis(60000L);
			setTimeBetweenEvictionRunsMillis(30000L);
			setNumTestsPerEvictionRun(-1);
		}
		
		public int getMaxIdle() {
			return maxIdle;
		}

		public void setMaxIdle(int maxIdle) {
			this.maxIdle = maxIdle;
		}

		public int getMinIdle() {
			return minIdle;
		}

		public void setMinIdle(int minIdle) {
			this.minIdle = minIdle;
		}

		public int getMaxActive() {
			return maxActive;
		}

		public void setMaxActive(int maxActive) {
			this.maxActive = maxActive;
		}

		public long getMaxWait() {
			return maxWait;
		}

		public void setMaxWait(long maxWait) {
			this.maxWait = maxWait;
		}

		public byte getWhenExhaustedAction() {
			return whenExhaustedAction;
		}

		public void setWhenExhaustedAction(byte whenExhaustedAction) {
			this.whenExhaustedAction = whenExhaustedAction;
		}

		public boolean isTestOnBorrow() {
			return testOnBorrow;
		}

		public void setTestOnBorrow(boolean testOnBorrow) {
			this.testOnBorrow = testOnBorrow;
		}

		public boolean isTestOnReturn() {
			return testOnReturn;
		}

		public void setTestOnReturn(boolean testOnReturn) {
			this.testOnReturn = testOnReturn;
		}

		public boolean isTestWhileIdle() {
			return testWhileIdle;
		}

		public void setTestWhileIdle(boolean testWhileIdle) {
			this.testWhileIdle = testWhileIdle;
		}

		public long getTimeBetweenEvictionRunsMillis() {
			return timeBetweenEvictionRunsMillis;
		}

		public void setTimeBetweenEvictionRunsMillis(
				long timeBetweenEvictionRunsMillis) {
			this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
		}

		public int getNumTestsPerEvictionRun() {
			return numTestsPerEvictionRun;
		}

		public void setNumTestsPerEvictionRun(int numTestsPerEvictionRun) {
			this.numTestsPerEvictionRun = numTestsPerEvictionRun;
		}

		public long getMinEvictableIdleTimeMillis() {
			return minEvictableIdleTimeMillis;
		}

		public void setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis) {
			this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
		}

		public long getSoftMinEvictableIdleTimeMillis() {
			return softMinEvictableIdleTimeMillis;
		}

		public void setSoftMinEvictableIdleTimeMillis(
				long softMinEvictableIdleTimeMillis) {
			this.softMinEvictableIdleTimeMillis = softMinEvictableIdleTimeMillis;
		}
	}

}

测试类:

/**
 * 
 * @author yujie.wang
 *	测试类
 */
public class TestMyObjectPool {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//创建对象池
		MyObjectPool pool = new MyObjectPool(new MyPoolableObjectFactory(),getConfig());
		//从对象池中借出一个对象
		MyObject object = pool.borrowObject();
		object.sayHello();
		//object.setValidate(false);
		//归还对象
		System.out.println("***归还对象***");
		pool.returnObject(object);

	}
	/**
	 * 配置对象池的相关参数
	 * @return
	 */
	public static MyObjectPool.MyObjectConfig getConfig(){
		MyObjectPool.MyObjectConfig config = new MyObjectPool.MyObjectConfig();
		config.setMaxActive(10);
		config.setMaxIdle(5);
		config.setMinIdle(0);
		config.setTestOnBorrow(true);
		config.setTestOnReturn(true);
		return config;
	}

}


执行代码运行结果如下:

new obj 对象已经激活
new obj 验证对象 true
new obj say hello world
***归还对象***
new obj 验证对象 true
new obj 钝化完成




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值