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

Jav*_*fdr 5 web-services connection-pooling production-environment apache-commons-pool

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

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

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

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

任何建议都会有所帮助!

编辑

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

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

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

小智 3

假设销毁/创建新方法没问题,并且您使用的是 2.0+ 版本的公共池,则可以使用废弃对象跟踪和删除来确保在借用对象且从未归还对象时容量不会永久泄漏。请参阅 AbandonedConfig 的 javadoc 了解配置设置以及采用 AbandonedConfig 实例作为参数的 GenericObjectPool 构造函数。启用废弃对象跟踪和删除后,当池容量不足时,池将销毁已借用但在超过removeAbandonedTimeout 的时间内未归还的实例。

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