如何使用apache commons pool通过超时将对象返回到池

时间:2012-06-12 17:32:18

标签: web-services connection-pooling production-environment apache-commons-pool

我正在使用Apache Commons Pool库来维护一个基础连接池(可以看作任何类型的连接,并不重要)。

我面临的问题是,我发现将对象返回池的唯一方法是通过从 GenericObjectPool returnObject 方法以编程方式执行此操作>上课。这会强制应用程序保证从池中借用对象的返回,无论应用程序中是否有任何异常或意外行为。

即使我在整个应用程序中控制对象返回池中,我发现完全依赖程序员返回对象的风险很大。有人知道在超过给定超时后自动返回对象的方法(回收对象)。一旦超过借用对象的超时,它也可以以任何方式使池创建新对象。

PS:我的应用程序公开了一组REST Web服务,它们连接到分布式memcache服务器(Couchbase)。该池创建了一组与Couchbase的连接。

任何建议都会有所帮助!

修改

我尝试过的第一个解决方案是创建一个新类( CouchbaseClientHandler ),其中包含存储在池中的对象类型的连接对象( CouchbaseClient )。 我已经在 CouchbaseClientHandler 上实现了 finalize 方法,确保关联实际上已返回到池中,如果对此对象的引用因意外异常而丢失。当垃圾收集器销毁对象时,将返回该对象。这没有按预期工作。无法预测垃圾收集器何时到达回收物体,并且通常需要比预期更长的时间。

我现在实际工作的解决方案有点不同,但更安全。 由于我的池旨在被Web服务使用,并且因为每个Web服务都在一个单独且独特的线程中运行(我在Tomcat上使用Jersey),所以我决定使用映射唯一线程ID的静态hashmap变量到执行Web服务时从池中借用的 CouchbaseClient 对象列表。由于我的Web服务是以这样的方式设计的,无论发生什么,处理程序方法将在返回之前处理最终输出,我可以确保始终运行返回池的方法 那些尚未有效返回池中的借用对象(连接)。

虽然这对我来说效果很好,但我真的想知道是否有更好的方法来声明或擦除未被返回的超时借用对象。

1 个答案:

答案 0 :(得分:3)

假设破坏/创建新方法是正常的并且您使用2.0版以上的公共池,则可以使用放弃的对象跟踪和删除来确保在借用对象并且永不返回时不会永久泄漏容量。有关配置设置,请参阅AbavonedConfig的javadoc;将AbandonedConfig实例作为参数,请参阅GenericObjectPool构造函数。启用废弃对象跟踪和删除后,池将破坏已借用但在池容量不足时返回的时间超过removeAbandonedTimeout的实例。

如果由于某种原因你必须使用版本1.x池,你可以获取源代码或直接使用DBCP 1.x附带的AbandonedObjectPool。