论坛首页 Java企业应用论坛

对象的池化

浏览 4155 次
锁定老帖子 主题:对象的池化
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-11-04   最后修改:2008-11-04
很多时候,要创建一个资源类对象,或者是一个大的应用数据对象,所花费的开销都是巨大的. 比如要建立一个连接,要根对方获得握手协定等等. 像这些花销巨大的对象,保存来做成全局不行,因为当前只能供给一个线成使用,那就只能池化了
池化的对象特点是:对象一次只能供给一个线成使用.但又必须尽量保存,以避免巨大的构建开销.
/**Resources是一个将要被池化的对象的接口,有一个被动撤消的close方法(为符合一般性资源类要求)
*/
interface Resources{
void close(){};
}

//真正的资源类
class ConcreteResources implements Resources{
void close(){
   //销毁内部相关资源eg: ...=null;
}
}

/**资源对象池
*/
class ResourcesPool implements Resources{

private List resL = null;
private int CACHE_MAX_SIZE = 10;


public synchronized Resources getResources(){
   if(resL == null)
      resL = new ArrayList();
   if(resL.isEmpty){
      Resources res = new DecResources();
      return res;
   }else{
   int last= resL.size()-1;
   Resources res = resL.get(last);
   resL.remove(last);
   return res;
   }
}

public synchronized void release(Resources res){
   if(resL.size>CACHE_MAX_SIZE){
     res.getReources.close();
   }else{
   resL.add(res);
   }
}

public synchronized void addResources throws Exception(Resources res){
   if(res instanceof DecResources){
     release(res);
   }else(throw new Exception("添加资源类型错误"))
}
}

/**为封闭掉close采用Decortor模式*/
class DecResources extends ResourcesPool implements Resources{
private Resources res= new ConcreteResources();

public void close(){
   release(this);
}

//为直接关闭提供出res
public Resources getResources(){
   return res;
}
}

/**使用:
如果需要获得对象,只需要
ResourcesPool pool = new ResourcesPool();
pool.add(new ...);
Resources res = pool.getResources();
使用.....
res.close();
*/


这是个简单的模型, close是针对大量资源类都提供的方法, 并不一定需要,自己的对象不要最好.逻辑看起来挺麻烦的.

同样,由于使用的是公共非栈对象,给出了syn,,如果使用频繁,类似cache,就使用rw


rw使用方式如下:
ReadWriteLock rw = ReentrantReadWriteLock();
Lock r = rw.readLock();
Lock w = rw.writeLock();

在类中需要读的方法段
r.lock();
...
r.unlock();

在类中需要写的方法段
w.lock();
...
w.unlock();


好多东西都忘记了,要查api,刚好复习下 呵呵
再次说明,这只是例子,编码是随心所欲的..
   发表时间:2008-11-04  
此对象无法继承任何对象。。
0 请登录后投票
   发表时间:2008-11-04  
commons-pool项目去看过么. 好象还可以啊
0 请登录后投票
   发表时间:2008-11-05  
除非有明确的证据证明池化能提高性能,否则尽量不要,Effective Enterprise JAVA上介绍说多数情况下池化却减低性能或者解决了问题却引来了更大的问题,所以池化要三思,一般像connection这么重量级的对象才池化
0 请登录后投票
   发表时间:2008-11-21  
关于commons-pool,我有一个疑问。我发现我的应用程序启动的时候会比较慢。起初发现是我们使用dbcp的连接池在初始化的时候会比较慢。当继续往里跟的时候,发现是dbcp连接池创建连接时,调用commons-pool创建对象时比较慢。没有设置dbcp的最小连接数,默认好像是5个。不知道为什么创建这5个对象为什么会这么慢。大概需要5,6秒中的时间。我们程序的启动速度主要就是被dbcp连接池和jax2初始化给拖慢的。(jax1初始化比jax2快)
0 请登录后投票
   发表时间:2008-11-21   最后修改:2008-11-21
bloodrate 写道
除非有明确的证据证明池化能提高性能,否则尽量不要,Effective Enterprise JAVA上介绍说多数情况下池化却减低性能或者解决了问题却引来了更大的问题,所以池化要三思,一般像connection这么重量级的对象才池化

正解,有时不要搞的太复杂,得不偿失。不要怀疑现代jvm的实力,除非有计量数据明确显示。
有时我们的优化,大部分是在做无用功,想当然的优化。所以三思
0 请登录后投票
   发表时间:2008-12-03  
bloodrate 写道
除非有明确的证据证明池化能提高性能,否则尽量不要,Effective Enterprise JAVA上介绍说多数情况下池化却减低性能或者解决了问题却引来了更大的问题,所以池化要三思,一般像connection这么重量级的对象才池化

对的 池化会导致更复杂
0 请登录后投票
   发表时间:2008-12-03  
kebo 写道
bloodrate 写道
除非有明确的证据证明池化能提高性能,否则尽量不要,Effective Enterprise JAVA上介绍说多数情况下池化却减低性能或者解决了问题却引来了更大的问题,所以池化要三思,一般像connection这么重量级的对象才池化

正解,有时不要搞的太复杂,得不偿失。不要怀疑现代jvm的实力,除非有计量数据明确显示。
有时我们的优化,大部分是在做无用功,想当然的优化。所以三思


0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics