- 浏览: 719558 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
cuqing:
laogao598599 写道匿名内部类不一定是局部内部类,还 ...
匿名内部类访问外部类中的局部变量必须是final属性 -
laogao598599:
匿名内部类不一定是局部内部类,还可以作为成员变量
匿名内部类访问外部类中的局部变量必须是final属性 -
stand_star:
非常给力!
struts2验证规则配置文件命名方式 -
wenlongsust:
嗯, 将返回值修改为html的确就可以了
EasyUI form ajax submit后,在IE下提示下载内容的解决办法 -
勇往直前wwt:
这样是自动增长,但每次id还得插入,如何只插入其他字段而让id ...
把主键定义为自动增长标识符类型
使用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/
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/
发表评论
-
java.lang.ClassCircularityError
2015-07-27 00:39 1356类循环依赖错误。在初始化一个类时,若检测到类之间循环依赖则抛出 ... -
随记内容
2015-06-09 00:10 0public static CloseableHttpClie ... -
httpclient3.1使用小结
2017-08-18 00:08 691Jakarta的httpclient3.1是 ... -
POI
2014-05-21 16:08 573Apache POI是一个开源的Java读写Excel、WOR ... -
servlet与js 跳转
2014-05-15 17:19 851servlet跳转 1.request.getRequestD ... -
jdk各个版本下载地址
2014-05-12 17:40 986http://www.oracle.com/technetwo ... -
Jackson库
2014-04-20 13:17 977概述 Jackson库(http://jac ... -
生成Webservice客户端的4种方法
2014-04-09 15:39 11061.使用Axis生产客户端代码(另存为bat文件) 之前很多次 ... -
map遍历
2013-12-14 23:41 521Map<String, String> map = ... -
POI处理Excel
2013-12-14 22:44 8971.读取2003 InputStream stream ... -
常用数据库 JDBC URL 格式
2013-12-04 18:35 1137Microsoft SQL Server Microsoft ... -
公共查询接口
2013-12-04 15:19 1215http://www.webmasterhome.cn/ ht ... -
天气预报接口
2013-12-04 11:18 1403天气预报接口(中国天气网) 中国天气weather.com ... -
Java 判断文件夹、文件是否存在
2013-12-04 10:00 51341、判断文件是否存在,不存在创建文件 File file=ne ... -
多线程读写资料利器-ReentrantReadWriteLock
2013-12-03 14:49 1311多线程读写文件利器-ReentrantReadWriteLoc ... -
保持顺序的 Java Properties 类
2013-12-02 16:21 907public class OrderedProperties ... -
java中用poi处理Excel表格之读取
2013-11-18 16:24 2031http://tool.oschina.net/apidocs ... -
科大讯飞语音识别服务
2013-09-03 17:06 14181.官方地址:http://open.voicecloud.c ... -
ibatis数据库字段带下划线(_)映射与java类不一致
2013-08-24 17:00 5343ibatis数据库字段带下划线(_)与java pojo对象映 ... -
Java Timer
2013-05-28 15:07 10591)java.util.Timer. 2)ServletC ...
相关推荐
Jakarta Commons Pool是一个用于在Java程序中实现对象池化的组件。它的基本情况是: 主要作者:Morgan Delagrange、Geir Magnusson、Craig McClanahan、Rodney Waldhoff、David Weinrich和Dirk Verbeeck 最新版本:...
《Jakarta Commons Cookbook》是Java开发领域中一本非常实用的指南,主要涵盖了Apache Jakarta Commons组件的使用技巧和最佳实践。这本书旨在帮助开发者更好地理解和利用Jakarta Commons库中的各种工具类和模块,...
### Apache Jakarta Commons 使用手册知识点详解 #### 一、概述 《Apache Jakarta Commons 使用手册》是一部详细介绍Apache Jakarta Commons项目下的各种Java组件的专业书籍。该书由Will Iverson编写,旨在为...
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 ...
DBCP(DataBase Connection Pool)是 apache common上的一个 java 连接池项目,也是 tomcat 使用的连接池组件,依赖 于Jakarta commons-pool 对象池机制,DBCP可以直接的在应用程序中使用。 使用DBCP会用到commons-...
Jakarta Commons Pool 包含了两个包:`org.apache.commons.pool` 和 `org.apache.commons.pool.impl`,总共有21个类,包括4个抽象类和6个接口。这个组件由多位作者共同开发,如Morgan Delagrange、Geir Magnusson等...
27. **Commons Pool**: 提供对象池接口和实现,有助于高效利用资源。 28. **Commons Primitives**: 为基本类型提供了 XML 验证框架,支持国际化验证规则和错误消息。 29. **Commons Resources**: 提供了一个框架来...
9. **DBCP和POOL**:数据库连接池组件,如Commons-DBCP和Commons-POOL,它们提高了数据库连接的管理和性能,降低了资源消耗。 10. **Email组件**:发送电子邮件的工具,支持多种邮件协议,如SMTP、SMTPS等,可以...
commons-pool 提供了通用对象池接口,一个用于创建模块化对象池的工具包,以及通常的对象池实 commons-primitives java 简单类型使用的扩展 commons-proxy 创建动态代理的库 commons-scxml commons-transaction ...
Apache Jakarta Commons是Apache软件基金会的一个项目集合,它提供了一系列实用工具类库,旨在简化Java开发。这个项目的主要目标是创建可重用的Java组件,这些组件涵盖了从数据处理到网络通信的各种领域。Iverson的...
DBCP(Database Connection Pool)是Apache Jakarta项目中的一个子项目,它利用了commons-pool对象池机制来实现数据库连接的复用,从而减少创建和释放数据库连接时的开销。Tomcat,一个广泛使用的Java应用服务器,...
Apache Commons DBCP是Apache软件基金会的Jakarta项目下的一个子项目,主要功能是提供数据库连接池服务。数据库连接池是一种在应用服务器启动时预创建一定数量的数据库连接,并将这些连接存储在一个池中,当多个用户...
commons-pool 提供了通用对象池接口,一个用于创建模块化对象池的工具包,以及通常的对象池实 commons-primitives java 简单类型使用的扩展 commons-proxy 创建动态代理的库 commons-scxml commons-transaction ...
《Jakarta Commons在线书架》一书深入探讨了Apache Jakarta Commons库的重要性和使用方法,为读者提供了一套全面的学习资源,旨在帮助Java开发者理解和掌握Jakarta Commons提供的各种工具和组件。以下是对书中提及的...
本篇文章将深入探讨Java对象池的实现原理,以及如何借鉴"Jakarta Commons Pool"组件来设计一个轻量级的对象池。 一、对象池的基本概念 对象池的基本工作流程包括以下几个步骤: 1. 初始化:预创建一定数量的对象并...
4. `jakarta-pool-1.5.2.jar`: 这是Apache Commons Pool的核心库文件,包含了所有必需的类和接口,用于实现对象池。 5. `jakarta-pool-1.5.2-sources.jar`: 源代码jar文件,可以用于查看和理解Pool库的内部工作原理...
以上只是Jakarta Commons项目的一部分,还有其他许多模块,如DBCP(数据库连接池)、Pool(对象池)和BCEL(Byte Code Engineering Library)等。这些组件极大地丰富了Java开发者的工具箱,使得他们能够更加高效地...
它基于Apache的Jakarta Commons Pool对象池机制,同时结合了Jakarta Commons Pool和Jakarta Commons DBCP的优点。C3P0提供了连接池的高级特性,如自动检测失效的连接并进行回收,支持多线程环境下的并发控制,以及...
【Jakarta Commons 学习】 Jakarta Commons 是一个由 Apache 软件基金会维护的 Java 开源项目集合,它提供了大量的实用工具类和组件,极大地丰富了 Java 的标准库功能。这个项目旨在解决常见的编程问题,提高开发...