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

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 on 2009-12-10 17:50 伊布 阅读(2017) 评论(5)  编辑  收藏

评论

# re: Java对象池的简单应用  回复  更多评论   

之前写过的,测试发现对象池性能不是太好,而且使用麻烦,因为有很多对象都是瞬态的,每次使用都需要初始化的。
2009-12-12 22:47 | TiGERTiAN

# re: Java对象池的简单应用  回复  更多评论   

使用对象池主要是为了提高系统性能常用的办法,但也不是说任何情况、任何环境都适合使用,有些情况下,不使用反而性能更好些,因为使用缓存的话,也要花费资源去管理缓存的。
个人建议:对于像“数据库连接”、“网络远程连接(类似Socket连接)”等比较重的资源可以去用,性能会有很大的提升的。
通过这个框架,可以自己去实现一个数据库的连接池,也是不错的。
2009-12-14 10:50 | 伊布

# re: Java对象池的简单应用  回复  更多评论   

看了这一句:
pool.setFactory(new EmployeeFactory());
本来利用对象池就是要减少new操作,一下子new EmployeeFactory(),一下子又new 其他的Factory,这好像这不是对象池应该做的啊。
2009-12-19 13:53 | awp001

# re: Java对象池的简单应用  回复  更多评论   

我这几天正在研究对象池,大家多交流
2009-12-19 13:54 | awp001

# re: Java对象池的简单应用  回复  更多评论   

@awp001
“利用对象池就是要减少new操作”,说的没错,使用对象池是为了提高性能,开始的时候预先创建若干个对象,把它放到池中,将来使用的时候也是从池中取出,使用后再回池里。
pool.setFactory(new EmployeeFactory());
是设置创建对象使用的工厂,使用了类似工厂模式,把创建Employee对象的职责都交个了这个EmployeeFactoyr类,由它统一负责创建具体的对象。
所以说想用对象池的话,必须有三个东东:
1)池(一般是一个)
2)创建工厂(一般是一个)
3)对象(大多数是多个)
2009-12-21 10:36 | 伊布

只有注册用户登录后才能发表评论。


网站导航: