目前只读了BaseObjectPool这部分的源码。下面是pool中几个重要的类,和自己业务类之间的UML关系图。
接口:
ObjectPool 定义实际池对象需要有哪些方法,
PoolableObjectFactory 定义了创建被池化对象的工厂接口
在实际开发中我们需要定义两个自己的业务类:
1、具体池化类
2、池化类的工厂类
package org.xiaoqingp.test.pool;
import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.PoolableObjectFactory;
import org.apache.commons.pool.impl.GenericObjectPool;
public class TestGenericObjectPool {
private static int cCount = 0;
private static synchronized String getCName() {
return "runner_" + cCount++;
}
/**
* 内部类,模拟connect
*
* @author xiaoqingP
*
*/
private class MyConnect {
private String name;
private boolean connected;
public MyConnect(String name) {
System.out.println("初始化 " + name + ":" + connected);
this.name = name;
}
public void connect() {
this.connected = true;
}
public void close() {
this.connected = false;
System.out.println("关闭 " + name + ": " + connected);
}
public boolean isConnected() {
return this.connected;
}
public String getName() {
return this.name;
}
public void print(String str) {
System.out.println("打印 " + this.name + " "+str);
}
}
/**
* 内部类,池对象创建工厂
*
* @author xiaoqingP
*
*/
private class MyConnectionPoolableObjectFactory implements
PoolableObjectFactory<MyConnect> {
@Override
public void activateObject(MyConnect obj) throws Exception {
obj.print("激活对象");
}
@Override
public void destroyObject(MyConnect obj) throws Exception {
obj.print("销毁对象");
}
@Override
public MyConnect makeObject() throws Exception {
MyConnect c = new MyConnect(TestGenericObjectPool.getCName());
return c;
}
@Override
public void passivateObject(MyConnect obj) throws Exception {
obj.print("钝化对象");
}
@Override
public boolean validateObject(MyConnect obj) {
obj.print("验证对象");
return true;
}
}
private class MyTask implements Runnable {
private ObjectPool<MyConnect> pool;
public MyTask(ObjectPool<MyConnect> pool) {
this.pool = pool;
}
public void run() {
MyConnect myConn = null;
try {
myConn = pool.borrowObject();
try {
myConn.print("借对象");
} catch (Exception ex) {
pool.invalidateObject(myConn);
myConn = null;
}
Thread.sleep(10L * 1000L);// 睡10秒钟
} catch (Exception ex) {
System.out.println("Cannot borrow connection from pool.");
ex.printStackTrace();
} finally {
if (myConn != null) {
try {
//return 时会调用钝化方法
pool.returnObject(myConn);
} catch (Exception ex) {
System.out
.println("Cannot return connection from pool.");
ex.printStackTrace();
}
}
}
}
}
/**
* 测试连接池数量不够,等待超时
*/
public static void main(String... strings) {
TestGenericObjectPool test = new TestGenericObjectPool();
PoolableObjectFactory<MyConnect> factory = test.new MyConnectionPoolableObjectFactory();
GenericObjectPool.Config config = new GenericObjectPool.Config();
config.lifo = false;
config.maxActive = 5;
config.maxIdle = 5;
config.minIdle = 1;
config.maxWait = 5 * 1000;
GenericObjectPool<MyConnect> pool = new GenericObjectPool<MyConnect>(
factory, config);
for (int i = 0; i < 10; i++) {
Thread thread = new Thread(test.new MyTask(pool));
thread.start();
}
}
}
输出结果:
初始化 runner_0:false
初始化 runner_4:false
初始化 runner_3:false
初始化 runner_2:false
初始化 runner_1:false
打印 runner_0 激活对象
打印 runner_3 激活对象
打印 runner_3 借对象
打印 runner_1 激活对象
打印 runner_1 借对象
打印 runner_2 激活对象
打印 runner_2 借对象
打印 runner_4 激活对象
打印 runner_4 借对象
打印 runner_0 借对象
Cannot borrow connection from pool.
Cannot borrow connection from pool.
Cannot borrow connection from pool.
java.util.NoSuchElementException: Timeout waiting for idle object
Cannot borrow connection from pool.
Cannot borrow connection from pool.
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1174)
at org.xiaoqingp.test.pool.TestGenericObjectPool$MyTask.run(TestGenericObjectPool.java:101)
at java.lang.Thread.run(Thread.java:619)
java.util.NoSuchElementException: Timeout waiting for idle object
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1174)
at org.xiaoqingp.test.pool.TestGenericObjectPool$MyTask.run(TestGenericObjectPool.java:101)
at java.lang.Thread.run(Thread.java:619)
java.util.NoSuchElementException: Timeout waiting for idle object
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1174)
at org.xiaoqingp.test.pool.TestGenericObjectPool$MyTask.run(TestGenericObjectPool.java:101)
at java.lang.Thread.run(Thread.java:619)
java.util.NoSuchElementException: Timeout waiting for idle object
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1174)
at org.xiaoqingp.test.pool.TestGenericObjectPool$MyTask.run(TestGenericObjectPool.java:101)
at java.lang.Thread.run(Thread.java:619)
java.util.NoSuchElementException: Timeout waiting for idle object
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1174)
at org.xiaoqingp.test.pool.TestGenericObjectPool$MyTask.run(TestGenericObjectPool.java:101)
at java.lang.Thread.run(Thread.java:619)
打印 runner_1 钝化对象
打印 runner_4 钝化对象
打印 runner_2 钝化对象
打印 runner_3 钝化对象
打印 runner_0 钝化对象
池中最大对象最有5个,单初始化了5个后,在过了最大等待时间borrow对象时就会报错。
上面的测试borrow对象时,会调用PoolableObjectFactory的makeOjbect方法创建对象,再调用activateObject方法,在return对象时,会调用passivateObject方法。

- 大小: 63.7 KB
分享到:
相关推荐
DBCP(DataBase Connection Pool)是 apache common上的一个 java 连接池项目,也是 tomcat 使用的连接池组件,依赖 于Jakarta commons-pool 对象池机制,DBCP可以直接的在应用程序中使用。 使用DBCP会用到commons-...
commons-pool 源代码commons-pool 源代码commons-pool 源代码commons-pool 源代码commons-pool 源代码
commons-pool2 2.4.3版本源码,使用eclipse等IDE工具导入
通过深入研究`commons-pool-1.5.5-src`源码,我们可以学习到如何设计和实现一个高效的对象池,这对于理解和优化资源管理,尤其是对于处理数据库连接池、线程池等场景,具有重要的实践价值。同时,源码中的设计模式和...
Apache Commons Pool 2 是一个广泛使用的对象池库,它的最新版本是 2.5.0。对象池在软件设计中是一种优化资源管理的技术,通过复用已创建的对象,避免频繁的创建和销毁过程,从而提高性能。Apache Commons Pool 2 ...
在"commons-pool2-2.4.zip"压缩包中,主要包含的是Apache Commons Pool 2.4版本的源码和相关的类库文件。 "commons-pool2-2.4.2.jar"是这个库的主要组件,它提供了对象池的实现和API,使得开发者能够轻松地为自己的...
Apache Commons Pool 是一个开源项目,提供了对象池化的实现,它是一个通用的对象池库,用于创建各种资源对象的池,如数据库连接池。标题中的"commons-pool-1.2-src.zip"表明这是一个包含Apache Commons Pool 1.2...
通过分析这些图像和源码,我们可以了解到Apache Commons Pool2的内部工作机制,如对象的生命周期管理、池的配置和性能优化等方面的知识。此外,源码阅读也能帮助我们理解设计模式的应用,如工厂模式、池模式等,并能...
DBCP(DataBase Connection Pool)是 apache common上的一个 java 连接池项目,也是 tomcat 使用的连接池组件,依赖 于Jakarta commons-pool 对象池机制,DBCP可以直接的在应用程序中使用。 使用DBCP会用到commons-...
Commons-Pool 提供了通用对象池接口,一个用于创建模块化对象池的工具包,以及通常的对象池实现. Primitives Commons-Primitives提供了一个更小,更快和更易使用的对Java基本类型的支持。当前主要是针对基本类型的 ...
编译jedis源码需要使用到的jar,需要使用链接池的话,需要导入此包!
commons-pool-1.5.4-sources 源码
这个源码包"commons-dbcp-1.2.2-src"包含了DBCP 1.2.2版本的所有源代码,对于学习和理解数据库连接池的工作原理非常有帮助。 在深入源码之前,我们先了解DBCP的基本概念和功能: 1. 数据库连接池:DBCP的核心就是...
Apache Commons Pool 是一个开源的Java对象池库,它提供了一种高效、灵活的方式来...同时,对于熟悉JDBC连接池(如Apache DataSource)或其他依赖于对象池技术的库,理解Apache Commons Pool的源码也会带来很大的帮助。
《Apache Commons Pool 1.4源码解析》 Apache Commons Pool是Apache软件基金会的一个开源项目,它提供了一个通用的对象池实现,使得开发者可以方便地在自己的应用中使用对象池技术。这里的"commons-pool-1.4-src....
《Apache Commons Pool 1.5.4 源码解析》 Apache Commons Pool 是一个开源的、基于Java的对象池库,它为开发者提供了一种有效地管理资源的方式,特别是那些昂贵创建但轻量级使用的对象。这个库的核心是对象池模式的...
commons-pool-1.3.jar commons-net-3.0.jar commons-logging-api-1.1.jar commons-logging-1.0.4.jar commons-lang-2.1.jar commons-io-1.3.2.jar commons-httpclient-3.0.jar commons-fileupload-1.2.1.jar commons...
这个"commons-pool-1.3.rar"压缩包包含了Apache Commons Pool 1.3版本的源码和相关文件。Apache Commons Pool是Apache软件基金会的一个项目,它提供了一套可扩展的对象池服务,可以被其他应用广泛使用。 **Apache ...
源码分析有助于定制自己的池实现或者优化使用Apache Commons Pool的方式。 总结来说,Apache Commons Pool 1.5.2 是一个强大的Java对象池库,可以帮助开发者提高应用程序的效率。通过合理的配置和使用,它可以有效...