我正在处理的应用程序使用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来构造键控对象池。现在,我已更改为使用修改后的配置,如下所示:
(其他配置保持不变,即默认值)
现在,当我运行应用程序时,我看到驱逐线程正在运行,并且在对象保持空闲的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()。
答案 0 :(得分:1)
minEvictableIdleTimeMillis不支持minIdle,你要找的是softMinEvictableIdleTimeMillis。请参阅以下文档:
但是,请注意,如果设置了minEvictableIdleTimeMillis,则忽略softMinEvictableIdleTimeMillis。