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

时间:2017-12-25 11:30:20

标签: java apache-commons object-pooling apache-commons-pool

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

我们有一个Object工厂,我们已经实现了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分钟,之后它就有资格被驱逐)
  4. (其他配置保持不变,即默认值)

    现在,当我运行应用程序时,我看到驱逐线程正在运行,并且在对象保持空闲的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()。

1 个答案:

答案 0 :(得分:1)

minEvictableIdleTimeMillis不支持minIdle,你要找的是softMinEvictableIdleTimeMillis。请参阅以下文档:

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

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