问题标签 [apache-commons-pool]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
apache-commons-pool - 如何防止在 org.apache.commons.pool2 中创建空闲对象
我们使用来自 org.apache.commons.pool2 的 GenericObjectPool。
存储在池中的对象非常重 - 它们消耗大量内存并且需要大量时间来创建。
通常只需要和获取池中的一个对象,但有时我们同时需要两个对象。
我们使用以下配置:
我们在创建池时使用一个对象预先填充池,因此我们始终有一个对象可供使用。此外,我们希望一个对象一直在池中,这就是 MinIdle = 1 的原因。
同时,在我们同时取了两个对象之后,我们希望第二个对象最终被销毁。
我们使用具有以下配置的 DefaultEvictionPolicy:
问题是:
当从池中取出第一个对象时,它会占用相当长的时间(几分钟)。没有对池中其他对象的请求。
但是突然一个新的(第二个)对象被创建并进入空闲状态。
所以我们有一个不必要的第二个对象,它在创建时会消耗大量 CPU 和大量内存。并且在处理第一个对象的同时,CPU/内存非常重要。
第二个对象稍后会被驱逐,但我们根本不需要它。
问题:我们如何防止创建第二个不必要的空闲对象?
据我了解,它是创建的,因为我们有 MinIdle = 1 并且当从池中取出第一个对象时,没有剩余的空闲对象。也许它是在执行驱逐工作的同一个线程中创建的,我不知道。
我们能做什么?
同样:我们需要一个对象始终存在(活动或空闲),并且仅当第一个对象处于活动状态(从池中获取)时有对第二个对象的请求时才创建第二个对象。我们不希望在没有明确请求的情况下创建第二个空闲对象。
java-8 - 动态收缩共享池
我预计会从多个来源传输大量文件。我正在使用 apache commons pool 进行 SSH 连接池。
我的设置:
- 启动工人前往多个目的地
- 使用公共池向同一目的地打开多个 SSH 会话
- 让线程池负责执行
现在这一切都很好并且有效。但是,SSH 对并发会话的数量有限制,虽然该解决方案采用可配置的数量,但可能是已经有人登录或正在进行的其他应用程序或活动正在使用该限制中的多个会话。
现在 commons 可以处理失败的会话,但如果有需求,它可以尝试创建一个新会话,如果仍然无法创建新会话,它也会失败。该失败的作业存在问题,因为如果它再次排队,它可能仍会以失败的会话结束。
如果出现某种类型的故障,是否有任何方法可以动态限制连接池,以确保在 SSH 恶魔处于限制状态时,至少对于该执行我们不会继续尝试创建新会话?