【问题标题】:How to return objects to the Pool by timeout using apache commons pool如何使用apache commons pool通过超时将对象返回到池中
【发布时间】:2012-06-12 17:32:18
【问题描述】:

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

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

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

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

任何建议都会有所帮助!

编辑

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 2014-07-02
      • 2015-07-02
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      相关资源
      最近更新 更多