`
shell_picker
  • 浏览: 16041 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
社区版块
存档分类
最新评论

试用 commons-pool

    博客分类:
  • Java
阅读更多

上一篇文章中提到,提高 Java 程序的性能的一个基本想法是,减少频繁的对象创建和销毁。

 

最近仔细分析了一下自己的一个程序,因为这个程序需要进行大量的字符串操作,会大量新建出临时的 StringBuffer 对象,这种对象用完一次就扔。尤其是在一个函数中,每次调用这个函数的时候都新建一个 StringBuffer ,函数退出的时候这个 StringBuffer 就没用了,而这个函数会被调用上万次,积累下来对性能的损耗可想而知。

 

所以我想到了使用对象池技术:每次用完 StringBuffer 并不销毁,而是把它存在那里,下次要用的时候只需要调用 setLength(0) 就又可以再次利用了,低碳环保。

 

正好看到 Apache Commons 有个 commons-pool(http://commons.apache.org/pool/),一种实现对象池的框架。于是试用了一下。

 

commons-pool 对对象池的抽象是:

public interface ObjectPool {
    Object borrowObject();
    void returnObject(Object borrowed);
}

 

“借出”对象和“归还”对象,这个用词很生动形象。

 

在池中的对象有两种状态:active 表示这个对象正在被程序使用;idle 空闲态,表示该对象在池中空闲,可以被分配出去。

 

于是我们不难理解如下配置:

 

maxIdle :指定空闲对象的最大数目。如果空闲对象超出这个值,GenericObjectPool 会清理空闲对象,减少到这个值。这是为了避免池中的对象过多,会占用过多的内存。

 

好了,废话不多说,直接上代码:

/**
 * 这段代码发布在公有领域(Public Domain),你可以自由地使用它
 *
 * @author henix[http://shell-picker.iteye.com/]
 */

import org.apache.commons.pool.PoolableObjectFactory;
import org.apache.commons.pool.impl.GenericObjectPool;
import org.apache.log4j.Logger;

public class StringBufferPool {
    private static Logger logger = Logger.getLogger(StringBufferPool.class);

    private GenericObjectPool pool;

    private static StringBufferPool instance = new StringBufferPool();

    public StringBufferPool() {
        pool = new GenericObjectPool(new StringBufferFactory());
        pool.setMaxActive(-1);
        pool.setWhenExhaustedAction(GenericObjectPool.WHEN_EXHAUSTED_GROW);
    }

    public static StringBufferPool getInstance() {
        return instance;
    }

    public StringBuffer borrowObject() {
        StringBuffer ret = null;
        try {
            ret = (StringBuffer) pool.borrowObject();
        } catch (Exception e) {
            logger.error(e.getMessage());
            if (logger.isDebugEnabled()) {
                e.printStackTrace();
            }
        }
        return ret;
    }

    public void returnObject(StringBuffer obj) {
        try {
            pool.returnObject(obj);
        } catch (Exception e) {
            logger.error(e.getMessage());
            if (logger.isDebugEnabled()) {
                e.printStackTrace();
            }
        }
    }
}

class StringBufferFactory implements PoolableObjectFactory {

    public void activateObject(Object obj) throws Exception {
        ((StringBuffer) obj).setLength(0);
    }

    public void destroyObject(Object obj) throws Exception {
    }

    public Object makeObject() throws Exception {
        return new StringBuffer();
    }

    public void passivateObject(Object obj) throws Exception {
    }

    public boolean validateObject(Object obj) {
        return true;
    }
}

 
在理解了对象池的实现原理之后,我们也可以自己实现一个,下面是我自己实现的简单 StringBuffer 池:

这里使用 Hashtable 来保证线程安全。

/**
 * 这段代码发布在公有领域(Public Domain),你可以自由地使用它
 */
import java.util.Hashtable;
import java.util.Iterator;

/**
 * A simple object pool for StringBuffer
 *
 * @author henix[http://shell-picker.iteye.com/]
 */
public class SimpleBufferPool {
    private static final Object V = new Object();
    private Hashtable activeObjs;
    private Hashtable idleObjs;

    private static int maxIdle = 8;

    private static SimpleBufferPool instance = new SimpleBufferPool();

    public static SimpleBufferPool getInstance() {
        return instance;
    }

    public SimpleBufferPool() {
        activeObjs = new Hashtable();
        idleObjs = new Hashtable();
    }

    public StringBuffer borrowObject() {
        StringBuffer ret;
        if (idleObjs.isEmpty()) {
            ret = new StringBuffer();
        } else {
            synchronized (idleObjs) {
                Iterator it = idleObjs.keySet().iterator();
                ret = (StringBuffer) it.next();
                idleObjs.remove(ret);
            }
        }
        activeObjs.put(ret, V);
        return ret;
    }

    public void returnObject(StringBuffer sb) {
        if (activeObjs.contains(sb)) {
            activeObjs.remove(sb);
            sb.setLength(0);
            idleObjs.put(sb, V);
            maintaince();
        }
    }

    protected synchronized void maintaince() {
        int n = idleObjs.size();
        if (n > maxIdle) {
            Iterator it = idleObjs.keySet().iterator();
            for (int i = n; i < maxIdle; i++) {
                Object key = it.next();
                idleObjs.remove(key);
            }
        }
    }
}
0
2
分享到:
评论

相关推荐

    java连接池有关jar:commons-pool-1.2.jar+commons-pool-1.3.jar+commons-pool.jar

    commons-pool-1.3.jar+commons-pool.jar;java连接池jar包java连接池;java连接池jar;commons-pool-1.2.jar;commons-pool-1.3.jar+commons-pool.jar;java连接池jar包java连接池;java连接池jar;commons-pool-1.2.jar;...

    commons-pool2-2.0-API文档-中文版.zip

    赠送jar包:commons-pool2-2.0.jar; 赠送原API文档:commons-pool2-2.0-javadoc.jar; 赠送源代码:commons-pool2-2.0-sources.jar; 赠送Maven依赖信息文件:commons-pool2-2.0.pom; 包含翻译后的API文档:...

    commons-pool2-2.10.0-API文档-中文版.zip

    赠送jar包:commons-pool2-2.10.0.jar; 赠送原API文档:commons-pool2-2.10.0-javadoc.jar; 赠送源代码:commons-pool2-2.10.0-sources.jar; 赠送Maven依赖信息文件:commons-pool2-2.10.0.pom; 包含翻译后的API...

    commons-pool2-2.3-API文档-中文版.zip

    赠送jar包:commons-pool2-2.3.jar; 赠送原API文档:commons-pool2-2.3-javadoc.jar; 赠送源代码:commons-pool2-2.3-sources.jar; 赠送Maven依赖信息文件:commons-pool2-2.3.pom; 包含翻译后的API文档:...

    commons-pool2-2.10.0-API文档-中英对照版.zip

    赠送jar包:commons-pool2-2.10.0.jar; 赠送原API文档:commons-pool2-2.10.0-javadoc.jar; 赠送源代码:commons-pool2-2.10.0-sources.jar; 赠送Maven依赖信息文件:commons-pool2-2.10.0.pom; 包含翻译后的API...

    commons-pool2-2.5.0-API文档-中英对照版.zip

    赠送jar包:commons-pool2-2.5.0.jar; 赠送原API文档:commons-pool2-2.5.0-javadoc.jar; 赠送源代码:commons-pool2-2.5.0-sources.jar; 包含翻译后的API文档:commons-pool2-2.5.0-javadoc-API文档-中文...

    commons-pool2-2.5.0-API文档-中文版.zip

    赠送jar包:commons-pool2-2.5.0.jar; 赠送原API文档:commons-pool2-2.5.0-javadoc.jar; 赠送源代码:commons-pool2-2.5.0-sources.jar; 赠送Maven依赖信息文件:commons-pool2-2.5.0.pom; 包含翻译后的API文档...

    commons-pool-1.3.jar 和commons-dbcp-1.2.2.jar

    标题中的"commons-pool-1.3.jar"和"commons-dbcp-1.2.2.jar"是两个在Java开发中常用的开源库,主要用于数据库连接池管理。它们都是Apache Commons项目的一部分,旨在提高数据库访问效率,减少数据库资源的消耗。 ...

    开发工具 commons-pool2-2.4.2

    开发工具 commons-pool2-2.4.2开发工具 commons-pool2-2.4.2开发工具 commons-pool2-2.4.2开发工具 commons-pool2-2.4.2开发工具 commons-pool2-2.4.2开发工具 commons-pool2-2.4.2开发工具 commons-pool2-2.4.2开发...

    commons-dbcp-1.2.1.jar + commons-pool-1.4.jar + commons-collections-3.2.jar

    本主题将详细解析标题和描述中提及的三个核心库:`commons-dbcp-1.2.1.jar`、`commons-pool-1.4.jar`以及`commons-collections-3.2.jar`,它们如何协同工作以提供高效的数据库连接管理服务。 1. **Apache Commons ...

    commons-pool.jar

    commons-pool-1.1.jar, commons-pool-1.2.jar, commons-pool-1.3-src.jar, commons-pool-1.3.jar, commons-pool-1.4.jar, commons-pool-1.5.1.jar, commons-pool-1.5.2-sources.jar, commons-pool-1.5.2.jar, ...

    commons-dbcp-1.4.jar和commons-pool-1.5.6.jar

    这两个JAR文件,`commons-dbcp-1.4.jar` 和 `commons-pool-1.5.6.jar`,在Java应用中起到了重要的角色,特别是对于那些需要高效管理数据库连接的大型系统。 Apache Commons DBCP是Apache Commons项目的一部分,它...

    commons-pool-1.6-API文档-中文版.zip

    赠送jar包:commons-pool-1.6.jar; 赠送原API文档:commons-pool-1.6-javadoc.jar; 赠送源代码:commons-pool-1.6-sources.jar; 赠送Maven依赖信息文件:commons-pool-1.6.pom; 包含翻译后的API文档:commons-...

    commons-pool2-2.11.1-bin.zip

    DBCP(DataBase Connection Pool)是 apache common上的一个 java 连接池项目,也是 tomcat 使用的连接池组件,依赖 于Jakarta commons-pool 对象池机制,DBCP可以直接的在应用程序中使用。 使用DBCP会用到commons-...

    commons-pool2-2.4.3-API文档-中文版.zip

    赠送jar包:commons-pool2-2.4.3.jar; 赠送原API文档:commons-pool2-2.4.3-javadoc.jar; 赠送源代码:commons-pool2-2.4.3-sources.jar; 赠送Maven依赖信息文件:commons-pool2-2.4.3.pom; 包含翻译后的API文档...

    commons-pool-1.6.jar、commons-pool

    都是自己项目积累下来的jar 真正的好用的jar 第一:commons-pool-1.3.jar 第二:commons-pool-1.5.4.jar 第三:commons-pool-1.6.jar 第四:commons-pool2-2.1.jar

    commons-pool-1.3.jar+commons-collections-3.2.1.jar

    标题中的"commons-pool-1.3.jar"和"commons-collections-3.2.1.jar"是两个Java库,它们在开发基于SSH(Struts、Spring、Hibernate)架构的应用时常常被用到。SSH是一种流行的企业级Java应用框架,用于构建高性能、可...

    commons-pool2-2.4.2-API文档-中英对照版.zip

    赠送jar包:commons-pool2-2.4.2.jar 赠送原API文档:commons-pool2-2.4.2-javadoc.jar 赠送源代码:commons-pool2-2.4.2-sources.jar 包含翻译后的API文档:commons-pool2-2.4.2-javadoc-API文档-中文(简体)-...

    commo-pool, commons-pool commons-pool commons-pool

    标题中的"commo-pool, commons-pool commons-pool commons-pool"可能是由于输入错误,正确的应该是"Apache Commons Pool"。这个库在IT行业中尤其在服务器端编程和数据存储解决方案中扮演着重要角色,因为它可以帮助...

    commons-collections.jar、commons-pool.jar、commons-dbcp-1.2.1.jar

    本篇文章将深入解析标题中的三个关键库:`commons-collections.jar`、`commons-pool.jar`和`commons-dbcp-1.2.1.jar`,以及它们在Java应用中的重要性。 首先,`commons-collections.jar`是Apache Commons ...

Global site tag (gtag.js) - Google Analytics