0

我们使用来自 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 并且当从池中取出第一个对象时,没有剩余的空闲对象。也许它是在执行驱逐工作的同一个线程中创建的,我不知道。

我们能做什么?

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

4

0 回答 0