`
ldzyz007
  • 浏览: 700103 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Jakarta Commons Pool

    博客分类:
  • java
阅读更多
使用Jakarta Commons Pool可以根据需要快速的实现自己的对象池,只需要实现PoolableObjectFactory或者KeyedPoolableObjectFactory接口。KeyedPoolableObjectFactory和PoolableObjectFactory的不同之处在于KeyedPoolableObjectFactory的每个方法都比PoolableObjectFactory多了一个Object key的参数,使用这个参数可以使得对象池中的每个对象都有所不同。
      PoolableObjectFactory定义了五个方法(摘至Jakarta Commons Pool API文档):
makeObject is called whenever a new instance is needed.
activateObject is invoked on every instance before it is returned from the pool.
passivateObject is invoked on every instance when it is returned to the pool.
destroyObject is invoked on every instance when it is being "dropped" from the pool (whether due to the response from validateObject, or for reasons specific to the pool implementation.)
validateObject is invoked in an implementation-specific fashion to determine if an instance is still valid to be returned by the pool. It will only be invoked on an "activated" instance.

例子

import java.net.SocketAddress;
import java.nio.channels.SocketChannel;

import org.apache.commons.pool.KeyedPoolableObjectFactory;

/**
* <p>Title: </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2005</p>
*
* <p>Company: </p>
*
* @author George Hill
* @version 1.0
*/

public class SocketPoolableObjectFactory implements KeyedPoolableObjectFactory {

    /**
     * 创建新的对象
     * @param key Object 创建对象需要用到的参数
     * @return Object SocketChannel实例
     * @throws Exception
     */
    public Object makeObject(Object key) throws Exception {
    SocketAddress address = (SocketAddress) key;

    // 创建SocketChannel
    SocketChannel channel = SocketChannel.open(address);

    return channel;
  }

  /**
   * 销毁对象
   * @param key Object 创建对象时的参数
   * @param obj Object 需要销毁的对象
   * @throws Exception
   */
  public void destroyObject(Object key, Object obj) throws Exception {
    SocketChannel channel = (SocketChannel) obj;

    if (channel != null)
      channel.close();
    channel = null;
  }

  /**
   * 检验对象是否有效
   * @param key Object 创建对象时的参数
   * @param obj Object 需要进行检验的对象
   * @return boolean 有效返回true,无效返回false
   */
  public boolean validateObject(Object key, Object obj) {
    SocketChannel channel = (SocketChannel) obj;

    if (channel != null && channel.isOpen() && channel.isConnected())
      return true;

    return false;
  }

  /**
   * 将对象激活,这里不需要做任何工作
   * @param key Object
   * @param obj Object
   * @throws Exception
   */
  public void activateObject(Object key, Object obj) throws Exception {
  }

  /**
   * 将对象挂起,这里不需要做任何工作
   * @param key Object
   * @param obj Object
   * @throws Exception
   */
  public void passivateObject(Object key, Object obj) throws Exception {
  }

}

测试

import java.io.IOException;
import java.net.*;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.*;

import org.apache.commons.pool.*;
import org.apache.commons.pool.impl.*;


public class TestThread implements Runnable {

  // 线程名称
  private String name;

  // 对象池
  private KeyedObjectPool pool;

  // 连接的网络地址
  private InetSocketAddress address;

  public TestThread(String name, KeyedObjectPool pool,
                    InetSocketAddress address) {
    this.name = name;
    this.pool = pool;
    this.address = address;
  }

  public void run() {
    System.out.println(name + ": Client Start");
    SocketChannel channel = null;

    try {
      channel = (SocketChannel) pool.borrowObject(address);
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }

    // 从对象池中借出对象成功
    if (channel != null) {
      System.out.println(name + ": Borrow Channel successfully!");

      try {
        channel.configureBlocking(false);

        // 创建Selector
        Selector selector = Selector.open();
        // 向Selector注册我们需要的READ事件
        SelectionKey skey = channel.register(selector, SelectionKey.OP_READ);

        boolean stop = false;
        int n = 0;
        int read = 0;
        ByteBuffer buffer = ByteBuffer.allocate(1024);

        System.out.println("Client Start");

        // 轮询
        while (!stop) {
          // 获取Selector返回的时间值
          n = selector.select();

          // 当传回的值大于0事,读事件发生了
          if (n > 0) {
            Set set = selector.selectedKeys();
            Iterator it = set.iterator();

            while (it.hasNext()) {
              skey = (SelectionKey) it.next();
              it.remove();

              if (skey.isReadable()) {
                SocketChannel sc = (SocketChannel) skey.channel();

                while ( (read = sc.read(buffer)) != -1) {
                  if (read == 0) {
                    break;
                  }

                  buffer.flip();
                  byte[] array = new byte[read];
                  buffer.get(array);
                  String s = new String(array);
                  System.out.print(s);
                  buffer.clear();

                  if (s.indexOf("new") != -1) {
                    stop = true;
                    System.out.println();
                  }
                }
              }
            }
          }
        }
      }
      catch (IOException ioe) {
        ioe.printStackTrace();
      }

      try {
        pool.returnObject(address, channel);
      }
      catch (Exception ex) {
        ex.printStackTrace();
      }
    }

    System.out.println(name + ": Client Stop");
  }

 
  public static void main(String[] args) throws Exception {
    SocketPoolableObjectFactory factory = new SocketPoolableObjectFactory();
    StackKeyedObjectPoolFactory poolFactory = new StackKeyedObjectPoolFactory(factory);
    KeyedObjectPool pool = poolFactory.createPool();

    // 创建连接清华BBS的线程
    Thread t1 = new Thread(new TestThread("清华", pool, new InetSocketAddress("bbs.tsinghua.edu.cn", 23)));
    t1.start();
    // 创建连接华南理工BBS的线程
    Thread t2 = new Thread(new TestThread("华南理工", pool, new InetSocketAddress("bbs.gznet.edu.cn", 23)));
    t2.start();
  }

}


参考
1. Jakarta Commons Pool网站:http://jakarta.apache.org/commons/pool/
2. IBM开发者的一篇很好的文章《使用Jakarta Commons Pool处理对象池化》       https://www.ibm.com/developerworks/cn/java/l-common-pool/
分享到:
评论

相关推荐

    commons-pool

    Jakarta Commons Pool是一个用于在Java程序中实现对象池化的组件。它的基本情况是: 主要作者:Morgan Delagrange、Geir Magnusson、Craig McClanahan、Rodney Waldhoff、David Weinrich和Dirk Verbeeck 最新版本:...

    jakarta-commons 相关依赖包

    jakarta-commons 相关依赖包,文件列表: commons-attributes-api.jar commons-attributes-compiler.jar commons-beanutils.jar commons-codec.jar commons-collections.jar commons-dbcp.jar commons-digester.jar ...

    commons-pool2-2.11.1-bin.zip

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

    Jakarta commons docs API CHM 格式

    commons-pool 提供了通用对象池接口,一个用于创建模块化对象池的工具包,以及通常的对象池实 commons-primitives java 简单类型使用的扩展 commons-proxy 创建动态代理的库 commons-scxml commons-transaction ...

    commons-pool 等jar包

    DBCP (Database Connection Pool)是一个依赖 Jakarta commons-pool 对象池机制的数据库连接池,Tomcat 的数据源使用的就是 DBCP。

    Java对象池实现源码

    java对象池轻量级实现,借鉴“Jakarta Commons Pool”组件实现思想。

    比较全面的:Jakarta-commons jar包(附: chm参考手册 & 资源简介)

    commons-pool 提供了通用对象池接口,一个用于创建模块化对象池的工具包,以及通常的对象池实 commons-primitives java 简单类型使用的扩展 commons-proxy 创建动态代理的库 commons-scxml commons-transaction ...

    commons-dbcp2-2.9.0-bin.zip

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

    DBCP( Database Connection Pool )数据库连接池

    DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序中使用,Tomcat的数据源使用的就是DBCP; 使用连接池的第一项工作就是导包,这里需要的两个jar包分别是: commons-dbcp-1.4....

    apache-commons源码及jar文件

    Commons-Pool 提供了通用对象池接口,一个用于创建模块化对象池的工具包,以及通常的对象池实现. Primitives Commons-Primitives提供了一个更小,更快和更易使用的对Java基本类型的支持。当前主要是针对基本类型的 ...

    JDBC常用连接池 c3p0 BDCP Druid

    DBCP (Database Connection Pool)是一个依赖Jakarta commons-pool对象池机制的数据库连接池,Tomcat的数据源使用的就是DBCP。目前 DBCP 有两个版本分别是 1.3 和 1.4。1.3 版本对应的是 JDK 1.4-1.5 和 JDBC 3,而...

    Java开发常用jar包

    11.commons-dbcp.jar:是一个依赖Jakarta commons-pool对象池机制的数据库连接池,Tomcat的数据源使用的就是DBCP。 12.commons-DbUtils.jar:Apache组织提供的一个资源JDBC工具类库,它是对JDBC的简单封装,对传统操作...

    spring-连接池配置

    一、数据库连接池依赖库 1、SPRING_HOME/lib/jakarta-commons/commons-dbcp.jar 2、SPRING_HOME/lib/jakarta-commons/commons-pool.jar 二、再在spring的applicationContext.xml文件中添加配置,使用数据库连接

    struts spring lib

    commons-pool-1.2.jar commons-validator.jar jakarta-oro.jar jdom.jar jstl.jar junit.jar log4j-1.2.8.jar naming-factory.jar poi-3.0-alpha2-20060616.jar poi-contrib-3.0-alpha2-20060616.jar poi-scratchpad...

    c3p0-0.9.1.2等等

    commons-pool dom4j-1.6.1 dwr ehcache-1.1 hibernate3 itext-1.3 jaas jakarta-oro-2.0.8 jaxen-1.1-beta-7 jdbc2_0-stdext jotm json-lib-2.3-jdk15-javadoc jta jxl log4j-1.2.11 log4j-1.2.14 portlet-api ...

    学生选课系统中所用的60个jar包

    collections-2.1.1.jar commons-dbcp.jar commons-digester.jar commons-fileupload.jar commons-httpclient.jar commons-lang.jar commons-logging.jar commons-pool.jar commons-validator.jar cos.jar db-ojb-...

    学生成绩管理系统 源码

    采用jsp+servlet+javabean,jsp负责少量的页面处理,以servlet为主。 ...详细介绍了jdbc的常用api以及数据库中的表的级联。...commons-collections.jar,commons-dbcp-1.1.jar,commons-pool-1.1.jar 数据库连接池

    JasperReport Struts2 整合所需完整jar

    commons-pool-1.3.jar dom4j-1.6.jar ehcache-1.1.jar freemarker-2.3.8.jar itext-1.3.1.jar iTextAsian.jar iTextAsianCmaps.jar jakarta-bcel-20050813.jar jasperreports-3.0.0.jar jasperreports-3.0.1-applet....

    struts配置资源包(稀有)

    antlr.jar,commons-collections.jar,commons-dbcp-1.2.1.jar,commons-lang.jar,commons-pool-1.3.jar,jakarta-oro-2.0.5.jar,struts-legacy.jar

    集成Spring的方法

    集成Spring的方法 1.在JPA基础上集成Spring dist/spring.jar lib/aspectj/*.jar(面向切面编程用到) lib/cglib/*.jar(因为要... lib/jakarta-commons/commons-dbcp.jar,commons-pool.jar,commons-logging.jar(数据源)

Global site tag (gtag.js) - Google Analytics