随笔 - 1, 文章 - 0, 评论 - 5, 引用 - 0
数据加载中……

2009年12月10日

Java对象池的简单应用

Apache 的commons pool框架为我们提供了对象池封装技术,也就是大家说的缓存技术,个人感觉还是不错的。

以下是一个简单的例子,希望能够起到抛砖引玉的作用,当然如果要应用到实际项目中的话,还需要完善很多内容,比如对象池的参数配置、日志处理、异常解决。。。

需要缓存的对象:
public class Employee {
      
static int counter=0;
      
private String name;
      
private int id;

      
public Employee(String name) {
        
this.name=name;
        
this.id=++counter;
        System.out.println(name
+" is created!");
      }


      
public String getName() {
        
return this.name;
      }


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


      
public void doWork() {
        System.out.println(
this.toString()+" do some thing");
      }


      
public String toString() {
        
return (" Name: " + this.name+",id:"+this.id);
      }


      
public void finalize() {
        System.err.println(
"Employee " + toString() + " made redundant");
      }

    }



创建缓存对象工厂,由于框架提供了一个基本的BaseKeyedPoolableObjectFactoy创建工厂,可以直接继承并实现makeObject方法,也就是创建缓存对象的具体实现,当然还有其他的创建工厂,这里就不具体讲了,可以查看Apache的相关资料。
import org.apache.commons.pool.BaseKeyedPoolableObjectFactory;

public class EmployeeFactory extends BaseKeyedPoolableObjectFactory {

    @Override
    
public Object makeObject(Object key) throws Exception {
        
return new Employee((String)key);
    }


     
}

客户端的调用例子,pool.addObject增加缓存对象,borrowObject从缓存中获取对象,如果没有则会创建一个新对象,returnObject释放对象,即使用完对象后要释放对象到缓存中。
public class TestKeyedObjectPool {
    
public static void main(String args[]) throws Exception {

        GenericKeyedObjectPool pool 
= new GenericKeyedObjectPool();
        pool.setFactory(
new EmployeeFactory());

        pool.addObject(
"Peter");
        pool.addObject(
"Jerry");
        pool.addObject(
"Richard");
        pool.addObject(
"Peter");

      System.out.println(
"Number of Peter employees in pool: " +
          pool.getNumIdle(
"Peter"+ " out of total employees: " +
          pool.getNumIdle());

        Employee employee 
= (Employee)pool.borrowObject("Peter");
        employee.doWork();
        pool.returnObject(
"Peter", employee);
        
      System.out.println(
"Number of Peter employees in pool: " +
                  pool.getNumIdle(
"Peter"+ " out of total employees: " +
                  pool.getNumIdle());
      }


}


运行结果:
Peter is created!
Jerry is created
!
Richard is created
!
Peter is created
!
Number of Peter employees in pool: 
2 out of total employees: 4
 Name: Peter,id:
1 do some thing
Number of Peter employees in pool: 
2 out of total employees: 4

posted @ 2009-12-10 17:50 伊布 阅读(2017) | 评论 (5)编辑 收藏