`
zhanghaj00
  • 浏览: 64109 次
社区版块
存档分类
最新评论

org.apache.commons.pool2 初体验 之GenericKeyedObjectPool

 
阅读更多
package com.binovel.util;


import org.apache.commons.pool2.KeyedPooledObjectFactory;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject;
import org.apache.commons.pool2.impl.GenericKeyedObjectPool;


public class MyTestPool {

	private GenericKeyedObjectPool<String, FileUtilTest> myObjectPool;

	public void init(){
		if(this.myObjectPool == null){
			this.myObjectPool = new GenericKeyedObjectPool<String, FileUtilTest>(
					new KeyedPooledObjectFactory<String, FileUtilTest>() {

						public PooledObject<FileUtilTest> makeObject(String key)
								throws Exception {
							//这里是生成对象
							FileUtilTest file = new FileUtilTest();
							DefaultPooledObject<FileUtilTest> pooledObject = new DefaultPooledObject<FileUtilTest>(file);
							return pooledObject;
						}
						public void destroyObject(String key,
								PooledObject<FileUtilTest> p) throws Exception {
							System.out.println("an object closed");
						}
						public boolean validateObject(String key,
								PooledObject<FileUtilTest> p) {
							// TODO Auto-generated method stub
							//这里是返回是否对象池的对象是正确的,如果返回false的话 就会一直取对象,直到报错
							//这里需要对象中有一个判断方法来判断是否active
							//我就是瞎搞搞 直到这个方法是干嘛就行了
							return true;
						}
						//看borrowobject源代码,在成功从queue中获取到对象时,会调用这个方法来激活这个对象
						//然后再调用上面那个validateObject来确定对象是不是好用,所以说这个方法也很重要
						//if (null != factory && null != obj) {  
             					//  try { 
      						//factory.activateObject(ref);  
                				//    if (!factory.validateObject(ref)) {  
                     				//   throw new Exception("ValidateObject failed");  
     						//	 }  
						public void activateObject(String key,
								PooledObject<FileUtilTest> p) throws Exception {
							// TODO Auto-generated method stub
							
						}
						public void passivateObject(String key,
								PooledObject<FileUtilTest> p) throws Exception {
							// TODO Auto-generated method stub
						}
					}
					);
			// Set max idle (not max active) since our connections always idle in the pool.
            this.myObjectPool.setMaxIdlePerKey(1);

            // We always want our validate method to control when idle objects are evicted.
            this.myObjectPool.setTestOnBorrow(true);
            this.myObjectPool.setTestWhileIdle(true);
		}
	}
	
	public GenericKeyedObjectPool<String, FileUtilTest> getPooded(){
		return this.myObjectPool;
	}
	public synchronized FileUtilTest getFileUtilTest(String key){
		
		FileUtilTest test = null;
		
		//这里我写死设置线程池中为5
		if(this.getPooded().getNumIdle(key)<5){
			
			try {
				// we want borrowObject to return the one we added.
				myObjectPool.setLifo(true);
				myObjectPool.addObject(key);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else{
			myObjectPool.setLifo(false);
		}
		while(test==null){
			try {
				//这里循环取出对象 有对象的话就break
				//其实写的不好 可以看下人家的pool中的实现
				
				/* while (connection == null) {
                connection = connectionsPool.borrowObject(key);
                synchronized (connection) {
                    if (connection.getConnection() != null) {
                        connection.incrementReferenceCount();
                        break;
                    }

                    // Return the bad one to the pool and let if get destroyed as normal.
                    connectionsPool.returnObject(key, connection);
                    connection = null;
                }
            }*/
				test = myObjectPool.borrowObject(key);
				synchronized (test) {
                    if (test != null) {
                        break;
                    }
                    //这里如果失败了就把对象放回去
                    myObjectPool.returnObject(key, test);
				}
			} catch (Exception e) {
				System.out.println("this is message");
				e.printStackTrace();
			}
		}
		return test;
	}
	public static void main(String[] args) {
		
		MyTestPool mypool = new MyTestPool();
		mypool.init();
		FileUtilTest file = mypool.getFileUtilTest("first");
		FileUtilTest file2 = mypool.getFileUtilTest("second");
		System.out.println(file);
		System.out.println(file2);
	}
}

 

这段时间看JMS 规范。 顺便看了下Activemq 的实现,其中activemq 自己实现了connectionpool 来存储大对象Connection  其中实现利用了apache.commons.pool中的GenericKeyedObjectPool 线程池 就顺便自己模仿这学习了下 ,代码里面写的很清楚了。。最后返回2个不同的对象

 

 附带一个blog 这里面是objectPool的源码分析 挺好的

http://shmilyaw-hotmail-com.iteye.com/blog/1986566

还有就是这个 写的是pool2的 整体结构,感觉比原来多的是一个PooledObject包装类,所以我们在makeObject中返回的是一个包装类而不是直接一个object,这是自己的理解,还要看看pool1中的实现,

据说pool2 全部重新架构了对象池。。。哎 不知道有时间没 看看吧

http://shmilyaw-hotmail-com.iteye.com/blog/1983845

分享到:
评论

相关推荐

    commons-pool2-2.10.0.jar

    3. **对象池的创建与配置**:Apache Commons Pool 提供了多种预定义的对象池实现,如 `GenericObjectPool&lt;T&gt;` 和 `GenericKeyedObjectPool, K&gt;`,分别用于无键和有键的对象池。这些池可以通过配置参数进行定制,如...

    commons-pool2-2.6.0-bin.zip

    2. **对象池实现**:`org.apache.commons.pool2.impl.GenericObjectPool` 和 `org.apache.commons.pool2.impl.GenericKeyedObjectPool` 是基础的对象池实现,它们可以管理任意类型的对象。 3. **对象生命周期管理**...

    commons-pool-1.6.jar.zip

    标题中的"commons-pool-1.6.jar.zip"表明这是一个包含Apache Commons Pool 1.6版本的压缩文件,其中的核心组件是`commons-pool-1.6.jar`。 **Apache Commons Pool 概述** Apache Commons Pool 是Apache软件基金会的...

    commons-pool2-2.8.1.jar

    Apache Commons Pool 2 提供了两种主要的对象池实现:`GenericObjectPool`和`GenericKeyedObjectPool`。前者用于管理单类型对象的池,后者则适用于管理键值对形式的对象。这两种池都提供了丰富的配置选项,包括最大...

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

    Apache Commons Pool 2是该库的最新版本,这里提供的两个压缩文件`commons-pool2-2.11.1-bin.zip`和`commons-pool2-2.11.1-src.zip`分别包含了编译后的二进制库和源代码。`bin.zip`文件通常包含编译好的JAR文件和...

    commons-pool-1.6.jar

    Apache Commons Pool提供了多种实现,包括基于先进先出(FIFO)策略的`GenericObjectPool`,以及基于最大空闲时间的`GenericKeyedObjectPool`。 **数据库连接池(DBCP)** DBCP是Database Connection Pool的缩写,...

    commons-pool-1.4.jar

    Apache Commons Pool 提供了两种主要的对象池实现:GenericObjectPool 和 GenericKeyedObjectPool。它们都是基于策略的池化框架,允许用户自定义池的行为,例如最大池大小、空闲超时、测试对象是否有效等。这些策略...

    commons-pool-1.4

    Apache Commons Pool 是一个开源的Java对象池库,版本1.4是该项目的一个稳定版本。对象池的概念是为了提高性能和资源管理,通过复用已创建的对象而不是每次需要时都创建新的对象。在Java应用中,特别是在大型企业级...

    commons-pool-1.5.4-src.tar.gz

    7. **扩展性**:除了基础功能,Apache Commons Pool 还提供了一些高级特性,如支持泛型对象池(`GenericKeyedObjectPool`),允许对键值对进行池化;以及支持自定义对象工厂(`ObjectFactory`),方便用户自定义对象...

    commons-pool-1.6.rar

    2. **多种池实现**:Apache Commons Pool 提供了多种池实现,如 `GenericObjectPool` 和 `GenericKeyedObjectPool`,它们分别支持无键和键值对对象的池化。这些实现提供了配置参数来调整池的行为,如最大活动对象数...

    commons-pool2-sr:Apache Commons Pool原始代码剖析笔记

    Apache Commons Pool2是一个Java对象池库,用于管理可重用对象。对象池是软件设计中的一个概念,通过池化资源,可以有效地减少创建和销毁对象的开销,提高系统的性能和效率。Apache Commons Pool2是Apache Commons...

    commons-pool-current.rar

    Apache Commons Pool 是一个Java对象池库,主要用于管理资源,尤其是短生命周期的对象,通过对象池化技术提高性能和效率。在Java应用中,频繁创建和销毁对象会消耗大量系统资源,对象池可以重用已创建的对象,减少新...

    commonsJar包(包含常用jar)

    在本案例中,提及的`commons-pool-1.6.jar`是Apache Commons中的一个组件,专门用于对象池化。 Apache Commons Pool是Java对象池设计模式的一个实现。对象池是一种设计模式,它通过预先创建并维护一组可重用的对象...

    apache线程池

    Apache线程池,也称为Apache Commons Pool,是Apache软件基金会的一个开源项目,提供了一套高效、灵活的线程池实现。这个库广泛应用于Java应用程序,尤其是那些需要处理大量并发请求的系统,比如Web服务器和数据库...

Global site tag (gtag.js) - Google Analytics