Java tutorial
import org.apache.commons.pool.impl.GenericKeyedObjectPool; public class TestKeyedObjectPool { public static void main(String args[]) throws Exception { GenericKeyedObjectPool pool = new GenericKeyedObjectPool(); pool.setFactory(new SkilledEmployeeFactory()); pool.addObject("Java"); pool.addObject("Java"); pool.addObject("VB"); pool.addObject("C++"); System.err.println("Number of Java employees in pool: " + pool.getNumIdle("Java") + " out of total employees: " + pool.getNumIdle()); Employee employee = (Employee)pool.borrowObject("Java"); employee.doWork(); System.err.println("Employee: " + employee); pool.returnObject("Java", employee); System.err.println("Number of Java employees in pool: " + pool.getNumIdle("Java") + " out of total employees: " + pool.getNumIdle()); } } --------------------- public class Employee { private static int base = 0; private int id; private String name; public Employee() { this.id = base++; } public int getId() { return this.id; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public void doWork() { // does nothing } public String toString() { return ("Id: " + this.id + ", Name: " + this.name); } public void finalize() { System.err.println("Employee " + toString() + " made redundant"); } } -------------------- import org.apache.commons.pool.BaseKeyedPoolableObjectFactory; public class SkilledEmployeeFactory extends BaseKeyedPoolableObjectFactory { public Object makeObject(Object key) { if (key == null || !(key instanceof String) || ((String) key).length() == 0) throw new IllegalArgumentException("Invalid key specified"); return new SkilledEmployee(key.toString()); } /*public boolean validateObject(Object key, Object obj) { if(obj instanceof Employee) { if(((Employee)obj).getName() == null) return true; } return false; } public void passivateObject(Object obj) throws Exception { if(obj instanceof Employee) { ((Employee)obj).setName(null); } else throw new Exception("Unknown object"); }*/ } ------------------------- public class SkilledEmployee extends Employee { private String skill; public SkilledEmployee(String skill) { this.skill = skill; } public String getSkill() { return this.skill; } public String toString() { return getSkill() + " -- " + getName(); } }