首先感谢下文作者,虽然没看你的内容,但是参考了参数。
Apache commons-pool对象池原理分析
最近遇到一个场景:
我作为一个中间件,连接一个没有提供接口的网站,htmlunit模拟html交互,然后把数据返回;对客户来说,我提供了一组标准接口。
因为该网站需要登录,网站登录过程很慢,所以面临两个问题:
第一是WebClient需要重用;
第二是不同的用户的htmlunit的WebClient实例是不能混用的,但是对于单用户来说,可能需要一个WebClient池。
本来想自己寨一个,后来想想细节太多不合适。先看了google guava cache,觉得api太复杂了,完全没看懂;然后又想到10年前看过apache commons pool源代码,查了一下现在是pool2了,完全重写,仔细看了看api,正好是我所需要的。
pool2实际使用很简单,但是官网的例子不太给力。其实只有三个要点(为什么是三点...):
1.Factory
回调。用于对象创建,销毁,验证,防止发呆等。
2.Pool的配置
池的参数。比如最大多少个,最小多少个,最长发呆时间(发呆过长就remove了),等等。
3.Pool实例
实际干活的。
针对我这个例子,首先定义一个factory
import com.gargoylesoftware.htmlunit.BrowserVersion import com.gargoylesoftware.htmlunit.WebClient import com.hitoz.auexpress.express.WebClientKey import org.apache.commons.pool2.BaseKeyedPooledObjectFactory import org.apache.commons.pool2.PooledObject import org.apache.commons.pool2.impl.DefaultPooledObject /** * Created by Ken on 2014/5/27. */ class WebClientFactory extends BaseKeyedPooledObjectFactory<WebClientKey, WebClient> { @Override void destroyObject(WebClientKey key, PooledObject<WebClient> p) throws Exception { key.worker?.doCleanup(p.object) } @Override public WebClient create(WebClientKey key) throws Exception { WebClient webClient = new WebClient(BrowserVersion.INTERNET_EXPLORER_8) webClient.options.activeXNative = false webClient.options.redirectEnabled = true webClient.options.useInsecureSSL = true webClient.options.javaScriptEnabled = false webClient.options.cssEnabled = false webClient.options.timeout = 10 * 1000L//10s webClient.options.throwExceptionOnFailingStatusCode = false key.worker?.doInit(key, webClient) return webClient } @Override public PooledObject<WebClient> wrap(WebClient value) { return new DefaultPooledObject<WebClient>(value) } @Override void passivateObject(WebClientKey key, PooledObject<WebClient> p) throws Exception { p.object?.closeAllWindows() } }
然后是参数:
GenericKeyedObjectPoolConfig config = new GenericKeyedObjectPoolConfig() config.setMaxTotal(500) //整个池最大值 config.setMaxTotalPerKey(5) //每个key的最大 config.setBlockWhenExhausted(true) config.setMinIdlePerKey(0) config.setMaxWaitMillis(-1) //获取不到永远等待 config.setNumTestsPerEvictionRun(Integer.MAX_VALUE) // always test all idle objects config.setTestOnBorrow(true) config.setTestOnReturn(false) config.setTestWhileIdle(false) config.setTimeBetweenEvictionRunsMillis(1 * 60000L) //-1不启动。默认1min一次 config.setMinEvictableIdleTimeMillis(10 * 60000L) //可发呆的时间,10mins config.setTestWhileIdle(false) //发呆过长移除的时候是否test一下先
最后是干活的pool
WebClientFactory webClientFactory = new WebClientFactory() GenericKeyedObjectPool<WebClientKey, WebClient> pool = new GenericKeyedObjectPool<WebClientKey, WebClient>(webClientFactory)
ok,从现在开始,只需要操作pool就可以了。
获取对象是
def webClient = pool.borrowObject(key)
使用完毕记得在finally里面
pool.returnObject(key, webClient)
通篇都是groovy代码,加上分号就是java。
相关推荐
Apache Commons Pool 2是该库的最新版本,这里提供的两个压缩文件`commons-pool2-2.11.1-bin.zip`和`commons-pool2-2.11.1-src.zip`分别包含了编译后的二进制库和源代码。`bin.zip`文件通常包含编译好的JAR文件和...
2. **通用对象池(GenericObjectPool)**:这是一个实现了Pool接口的具体对象池类,提供了许多可配置的参数来调整池的行为,如最大活动对象数、最大空闲对象数、超时时间等。 3. **对象工厂(ObjectFactory)**:...
1. **通用对象池接口**:`org.apache.commons.pool2.PooledObjectFactory` 和 `org.apache.commons.pool2.Poolable` 接口,定义了对象池的基本操作和对象的池化行为。 2. **对象池实现**:`org.apache.commons.pool2...
1. **对象池接口**:Pool2提供了一个通用的对象池接口(`ObjectPool`),它定义了基本的池操作,如借用、归还和验证对象。这个接口使得开发者可以自定义池化策略。 2. **基础池实现**:库中包含了一些基础的`...
Apache Commons Pool2是一个Java对象池库,用于管理资源对象,如数据库连接或线程,以提高性能和效率。这个库的核心理念是通过复用已经创建的对象来减少对象的创建和销毁带来的开销,从而优化应用的性能。在"commons...
1. 引入依赖:除了`jedis-2.8.1.jar`,还需要引入`commons-pool2`的相关依赖。 2. 创建`JedisPoolConfig`配置:这是`Commons Pool 2`的配置类,可以设置最大活动对象数、最大空闲对象数、超时时间等参数。 3. 初始化...
标题中的"jedis-2.9.0+commons-pool2-2.4.2redis依赖包"指的是一款基于Java实现的Redis客户端库Jedis的2.9.0版本,与Apache Commons Pool 2.4.2版本相结合的依赖包。这个组合主要用于优化Redis连接池管理,提高应用...
2. **对象池实现**:除了API,Commons Pool还提供了一些预定义的对象池实现,如`GenericObjectPool`,这是一个通用的对象池实现,支持基本的池策略,如最大活动对象数、空闲对象的最大数量等。 3. **池化策略**:...
Apache Commons Pool2是一个通用的对象池服务,它提供了一个框架,用于创建可复用对象池。对象池设计的主要目标是减少频繁创建和销毁对象的开销,这对于那些创建和初始化成本较高的对象尤其有益。Pool2库提供了基础...
Apache Commons Pool2是一个Java对象池库,用于管理资源对象,如数据库连接或网络套接字。这个库的主要目的是提高性能和资源效率,通过重用已创建的对象而不是每次需要时都创建新的。在给定的场景中,`commons-pool2...
Apache Commons Pool 是Apache软件基金会的一个开源项目,它提供了一种基于池化概念的通用对象池API。对象池化是一种设计模式,它允许程序预先创建一组对象并保持它们处于就绪状态,以便在需要时快速分配,而不是...
在"commons-pool2-2.3"这个版本中,包含了以下关键组件和功能: 1. **对象池接口(Poolable)**:Apache Commons Pool 提供了 `PoolableObjectFactory` 接口,用于创建、验证和销毁池中的对象。`Poolable` 接口标记...
Apache Commons Pool2是Java开发的一个对象池库,它提供了对对象池模式的实现,以便高效地管理和重用有限资源。在本案例中,`commons-pool2-2.2-bin.zip` 是Apache Commons Pool 2.2版本的二进制发布包,用于配置...
`commons-pool-1.5.6.jar` 提供了一套通用的对象池服务,DBCP利用它来管理数据库连接对象。对象池技术可以有效地复用对象,减少创建和销毁对象的开销。在DBCP中,Commons Pool主要负责以下任务: 1. **...
Apache Commons Pool库正是提供了这种对象池服务,它为各种可池化对象提供了一种通用的框架。 DBCP则是基于commons-pool的数据库连接池实现。它提供了数据库连接的创建、管理和分配服务。在DBCP中,数据库连接被视...
Apache Commons Pool 是一个通用的对象池库,它是DBCP的基础,提供了一组框架和接口,用于创建和管理对象池。对象池技术可以应用于任何需要重复创建和销毁的对象,通过复用已创建的对象来提高性能。Commons Pool的...
Apache Commons Pool是对象池设计模式的一个实现,它提供了一个通用的对象池服务。对象池可以有效地管理对象的创建和销毁,避免频繁的创建和销毁操作导致的性能开销。在Pool 1.6版本中,你可以找到以下关键功能: 1...
标题 "commons-dbcp-2-2.50+commons-pool2-2.6.0+commons-logging-1.2" 涉及到的是Java开发中的几个关键组件,它们是Apache Commons项目的一部分,主要用于数据库连接管理和日志记录。Apache Commons是一个包含多个...
Commons Pool 是一个通用的对象池服务,它提供了一种高效管理对象的方式,避免了频繁创建和销毁对象的开销。在数据库连接池中,Commons Pool 用于管理数据库连接,使得多个用户可以共享有限数量的数据库连接,提高...