`

读commons-pool源码

    博客分类:
  • java
 
阅读更多
目前只读了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
分享到:
评论

相关推荐

    commons-pool2-2.11.1-bin.zip

    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-pool 源代码

    commons-pool2源码

    commons-pool2 2.4.3版本源码,使用eclipse等IDE工具导入

    commons-pool-1.5.5-src 源码

    通过深入研究`commons-pool-1.5.5-src`源码,我们可以学习到如何设计和实现一个高效的对象池,这对于理解和优化资源管理,尤其是对于处理数据库连接池、线程池等场景,具有重要的实践价值。同时,源码中的设计模式和...

    commons-pool2-2.5.0-bin.zip

    Apache Commons Pool 2 是一个广泛使用的对象池库,它的最新版本是 2.5.0。对象池在软件设计中是一种优化资源管理的技术,通过复用已创建的对象,避免频繁的创建和销毁过程,从而提高性能。Apache Commons Pool 2 ...

    commons-pool2-2.4.zip

    在"commons-pool2-2.4.zip"压缩包中,主要包含的是Apache Commons Pool 2.4版本的源码和相关的类库文件。 "commons-pool2-2.4.2.jar"是这个库的主要组件,它提供了对象池的实现和API,使得开发者能够轻松地为自己的...

    commons-pool-1.2-src.zip

    Apache Commons Pool 是一个开源项目,提供了对象池化的实现,它是一个通用的对象池库,用于创建各种资源对象的池,如数据库连接池。标题中的"commons-pool-1.2-src.zip"表明这是一个包含Apache Commons Pool 1.2...

    Apache commons-pool2-2.4.2源码学习笔记

    通过分析这些图像和源码,我们可以了解到Apache Commons Pool2的内部工作机制,如对象的生命周期管理、池的配置和性能优化等方面的知识。此外,源码阅读也能帮助我们理解设计模式的应用,如工厂模式、池模式等,并能...

    commons-dbcp2-2.9.0-bin.zip

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

    apache-commons源码及jar文件

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

    commons-pool2-2.4.3.jar

    编译jedis源码需要使用到的jar,需要使用链接池的话,需要导入此包!

    commons-pool-1.5.4-sources.jar

    commons-pool-1.5.4-sources 源码

    commons-dbcp源码

    这个源码包"commons-dbcp-1.2.2-src"包含了DBCP 1.2.2版本的所有源代码,对于学习和理解数据库连接池的工作原理非常有帮助。 在深入源码之前,我们先了解DBCP的基本概念和功能: 1. 数据库连接池:DBCP的核心就是...

    commons-pool-1.5.7-src.zip

    Apache Commons Pool 是一个开源的Java对象池库,它提供了一种高效、灵活的方式来...同时,对于熟悉JDBC连接池(如Apache DataSource)或其他依赖于对象池技术的库,理解Apache Commons Pool的源码也会带来很大的帮助。

    commons-pool-1.4-src.zip

    《Apache Commons Pool 1.4源码解析》 Apache Commons Pool是Apache软件基金会的一个开源项目,它提供了一个通用的对象池实现,使得开发者可以方便地在自己的应用中使用对象池技术。这里的"commons-pool-1.4-src....

    commons-pool-1.5.4-src.tar.gz

    《Apache Commons Pool 1.5.4 源码解析》 Apache Commons Pool 是一个开源的、基于Java的对象池库,它为开发者提供了一种有效地管理资源的方式,特别是那些昂贵创建但轻量级使用的对象。这个库的核心是对象池模式的...

    org.apache.commons 常用jar 以及部分源码

    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

    这个"commons-pool-1.3.rar"压缩包包含了Apache Commons Pool 1.3版本的源码和相关文件。Apache Commons Pool是Apache软件基金会的一个项目,它提供了一套可扩展的对象池服务,可以被其他应用广泛使用。 **Apache ...

    commons-pool1.5.2 jar包+源码

    源码分析有助于定制自己的池实现或者优化使用Apache Commons Pool的方式。 总结来说,Apache Commons Pool 1.5.2 是一个强大的Java对象池库,可以帮助开发者提高应用程序的效率。通过合理的配置和使用,它可以有效...

Global site tag (gtag.js) - Google Analytics