键控对象池不始终保持池中空闲对象的最小数量

Keyed object pool not keeping minimum number of idle objects in pool at all times

我正在开发的应用程序使用 Apache Commons library 来实现 KeyedObjectPools。

我们有一个对象工厂,其中我们已经实现了 KeyedPoolObjectFactory 接口中指定的方法。实现如下所示:

class MyKeyedPooledObjectFactory implements KeyedPooledObjectFactory<myKey, myObject> {

    makeObject(key) {
          //things that make myObject and
          //return DefaultPooledObject<>(myObject)
    }
    activateObject(key, pooledObject) {
        log.info("Activating object for {}", key)
    }

    passivateObject(key, pooledObject) {
        log.info("Passivating object for {}", key)
        pooledObject.getObject().someMethodToResetObject()
    }
    destroyObject(key, pooledObject) {
        log.info("Destroying object for {}", key)
    }
    validateObject(key, pooledObject) { // never gets called in code
        return true; 
    }
}

直到最近 default configurations 才被用来构建键控对象池。现在,我已经改为使用修改后的配置如下:

  1. TimeBetweenEvictionRunsMillis = 300000(设置为 5 分钟并启用空闲对象驱逐线程)
  2. MinIdlePerKey = 1(我需要始终在池中为每个键保留至少 1 个对象以满足我们的延迟要求)
  3. MinEvictableIdleTimeMillis = 300000(即对象可以在池中保持空闲 5 分钟,之后它有资格被驱逐)

(其他配置保持不变,即默认值)

现在,当我 运行 应用程序时,我看到逐出线程正在 运行ning 并且在对象保持空闲的 10 分钟内,将按预期调用 destroyObject() 方法。 但是,我还注意到该池没有为每个键保持至少 1 个空闲对象。

我的理解是有一种机制可以确保设置minimum number of objects per key will be available if minIdlePerKey。但这似乎并没有发生,我无法找出同样的原因。

关于为什么会发生这种情况的任何帮助或见解都将非常有用。

我看到的唯一警告是,我指的是文档 api-1.6 文档,同时使用 api-2.0 中的方法。我使用了 poolConfig.setMinIdlePerKey(myMinIdlePerKeyValue),它应该等同于 1.6 版本中的 poolConfig.setMinIdle()。

minEvictableIdleTimeMillis 不支持 minIdle,您正在寻找的是 softMinEvictableIdleTimeMillis。请参阅以下文档:

https://commons.apache.org/proper/commons-pool/apidocs/org/apache/commons/pool2/impl/BaseGenericObjectPool.html#setSoftMinEvictableIdleTimeMillis(long)

但是,请注意,如果设置了 minEvictableIdleTimeMillis,将忽略 softMinEvictableIdleTimeMillis。