5

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

我面临的问题是,我发现将对象返回池的唯一方法是通过调用GenericObjectPool类的returnObject方法以编程方式完成。这迫使应用程序保证一旦从池中借用对象就返回,而不管应用程序中的任何异常或意外行为。

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

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

任何建议都会有所帮助!

编辑

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

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

尽管这对我来说效果很好,但我真的很想知道是否有更好的方法来通过超时借用的对象来声明或擦除尚未归还的对象。

4

1 回答 1

3

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

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

于 2015-01-05T20:10:31.917 回答