1. 程式人生 > >commons-pool2學習總結

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