如何防止在 org.apache.commons.pool2 中创建空闲对象

问题描述

我们使用来自 org.apache.commons.pool2 的 GenericObjectPool。

存储在池中的对象非常繁重 - 它们消耗大量内存并花费大量时间来创建。

通常只需要和获取池中的一个对象,但有时我们同时需要两个对象。

我们使用以下配置:

MaxIdle = 2;
MinIdle = 1;

我们在池创建时用一个对象预先填充池,所以我们总是有一个可以使用的对象。此外,我们希望池中始终有一个对象,这就是 MinIdle = 1 的原因。

同时,在我们同时获取两个对象后,我们希望最终销毁第二个对象。

我们使用具有以下配置的 DefaultevictionPolicy:

MinevictableIdleTime = -1; // not used
SoftMinevictableIdleTime = a few minutes;
TimeBetweenevictionRuns = a few minutes;

问题是:

当从池中取出第一个对象时,它会占用相当长的时间(几分钟)。没有对池中其他对象的请求。

但是突然创建了一个新的(第二个)对象并且它进入空闲状态。

所以我们有一个不必要的第二个对象,它在创建时消耗大量 cpu 和大量内存。并且在处理第一个对象的同时,cpu/内存非常重要。

这第二个对象稍后被驱逐,但我们根本不需要它。

问题:我们如何防止创建第二个不必要的空闲对象?

据我所知,它是创建的,因为我们有 MinIdle = 1,并且当从池中取出第一个对象时,没有空闲对象。也许它是在执行驱逐作业的同一线程中创建的,我不知道。

我们能做什么?

再次:我们需要一个对象始终存在(活动或空闲),并且仅当第一个对象处于活动状态(从池中获取)时有对第二个对象的请求时才创建第二个对象。我们不希望在没有明确请求的情况下创建第二个空闲对象。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)