0

我正在开发的一个应用程序使用Apache Commons 库来实现 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; 
    }
}

直到最近,默认配置才被用于构建键控对象池。现在,我已更改为使用修改后的配置,如下所示:

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

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

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

我的理解是,如果设置了 minIdlePerKey,有一种机制可以确保每个键的最小对象数可用。但这似乎并没有发生,我无法找出同样的原因。

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

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

4

1 回答 1

1

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

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

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

于 2017-12-25T20:44:08.017 回答