我正在使用 Apache Commons Pool 库来维护一个 couchbase 连接池(可以看作任何类型的连接,并不重要)。
我面临的问题是,我发现将对象返回池的唯一方法是通过调用GenericObjectPool类的returnObject方法以编程方式完成。这迫使应用程序保证一旦从池中借用对象就返回,而不管应用程序中的任何异常或意外行为。
尽管我在整个应用程序中控制对象返回到池中,但我发现完全依赖程序员返回对象是有风险的。有没有人知道一旦超过给定超时(回收对象)自动返回对象的方法。一旦借用对象超过超时,它也可以以任何方式使池创建新对象。
PS:我的应用程序公开了一组 REST Web 服务,它们连接到分布式内存缓存服务器(Couchbase)。该池创建一组到 Couchbase 的连接。
任何建议都会有所帮助!
编辑
我尝试的第一个解决方案是创建一个新类 ( CouchbaseClientHandler ),其中包含来自存储在池 ( CouchbaseClient )中的对象类型的连接对象。我已经在CouchbaseClientHandler上实现了finalize方法,以确保如果对该对象的引用因意外异常而丢失,则关联实际上返回到池中。当垃圾收集器销毁对象时,该对象将被返回。这没有按预期工作。无法预测垃圾收集器何时会到达回收对象,而且它通常花费的时间比预期的要长。
我现在实际工作的解决方案有点不同,但更安全。由于我的池旨在供 Web 服务使用,并且由于每个 Web 服务都在单独且唯一的线程中运行(我在 Tomcat 上使用 Jersey),因此我决定使用映射唯一线程 ID 的静态 hashmap 变量到在执行 web 服务时从池中借用的CouchbaseClient对象列表。由于我的 Web 服务的设计方式是,无论发生什么,处理程序方法都会在返回之前处理最终输出,因此我可以确保始终运行一个方法,将那些借用的对象(连接)返回到池中,即没有被有效地返回到池中。
尽管这对我来说效果很好,但我真的很想知道是否有更好的方法来通过超时借用的对象来声明或擦除尚未归还的对象。