【发布时间】: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