gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:06:48 25 4
gpt4 key购买 nike

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

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

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

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

任何建议都会有所帮助!

编辑

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

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

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

最佳答案

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

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

关于web-services - 如何使用 apache commons pool 通过超时将对象返回到池中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11001801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com