我正在开发的一个应用程序使用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;
}
}
直到最近,默认配置才被用于构建键控对象池。现在,我已更改为使用修改后的配置,如下所示:
- TimeBetweenEvictionRunsMillis = 300000(设置为 5 分钟并启用空闲对象驱逐线程)
- MinIdlePerKey = 1(我需要在池中始终为每个键保留至少 1 个对象以满足我们的延迟要求)
- MinEvictableIdleTimeMillis = 300000(即,对象可以在池中保持空闲 5 分钟,之后它就有资格被驱逐)
(其他配置保持不变,即默认值)
现在,当我运行应用程序时,我看到驱逐线程正在运行,并且在对象保持空闲的 10 分钟内,destroyObject() 方法正在按预期调用。但是,我也注意到池没有为每个键维护至少 1 个空闲对象。
我的理解是,如果设置了 minIdlePerKey,有一种机制可以确保每个键的最小对象数可用。但这似乎并没有发生,我无法找出同样的原因。
关于为什么会发生这种情况的任何帮助或见解都会非常有用。
我看到的唯一警告是,我指的是文档 api-1.6 文档,同时使用 api-2.0 中的方法。我使用了 poolConfig.setMinIdlePerKey(myMinIdlePerKeyValue) ,它应该等同于 1.6 版本中的 poolConfig.setMinIdle() 。