键控对象池不始终保持池中空闲对象的最小数量
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 才被用来构建键控对象池。现在,我已经改为使用修改后的配置如下:
- TimeBetweenEvictionRunsMillis = 300000(设置为 5 分钟并启用空闲对象驱逐线程)
- MinIdlePerKey = 1(我需要始终在池中为每个键保留至少 1 个对象以满足我们的延迟要求)
- 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。请参阅以下文档:
但是,请注意,如果设置了 minEvictableIdleTimeMillis,将忽略 softMinEvictableIdleTimeMillis。
我正在开发的应用程序使用 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 才被用来构建键控对象池。现在,我已经改为使用修改后的配置如下:
- TimeBetweenEvictionRunsMillis = 300000(设置为 5 分钟并启用空闲对象驱逐线程)
- MinIdlePerKey = 1(我需要始终在池中为每个键保留至少 1 个对象以满足我们的延迟要求)
- 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。请参阅以下文档:
但是,请注意,如果设置了 minEvictableIdleTimeMillis,将忽略 softMinEvictableIdleTimeMillis。