Параметр minEvictableIdleTimeMillis работает не так, как ожидалось

#java #object-pooling #apache-commons-pool

#java #объединение объектов #apache-commons-pool

Вопрос:

У меня есть этот пул объектов (с использованием org.apache.commons.pool2), из которого я заимствую (или создаю) один.

Максимальный размер простоя, который я установил, равен 3 (при максимальном размере 5). Это было установлено с пониманием того, что если незанятых объектов больше 3, они будут уничтожены (BasePooledObjectFactory#destroyObject)

Что это делает в моей системе, так это то, что создает и уничтожает несколько объектов, что является дорогостоящим. Я бы хотел, чтобы он уничтожался только при бездействии в течение более длительного периода (скажем, 1 минуты).

Я попытался установить setMinEvictableIdleTimeMillis (по умолчанию, как я мог видеть, 30 минут), чтобы сделать это. Значение по умолчанию, а также настройка, похоже, не работают — например, я вижу, что объект уничтожается довольно часто, когда количество простоев превышает 4.

Почему это может происходить и как я могу убедиться, что незанятые объекты не уничтожаются так часто?

Комментарии:

1. Не проверено, поэтому просто в качестве комментария: Я думаю, что вы хотите, чтобы minIdle = 3, maxIdle = maxTotal = 5. => Сохраняйте как минимум 3 незанятых объекта на неопределенный срок, до 5, если они простаивают менее minEvictableIdleTime.

Ответ №1:

недостаточно использовать minEvictableIdleTimeMillis только

вы также должны указать, timeBetweenEvictionRunsMillis который равен -1 по умолчанию.

объекты пула удаляются потоком проверки / очистки, поэтому timeBetweenEvictionRunsMillis этот поток будет запущен, поэтому он проверит minEvictableIdleTimeMillis идеальные потоки и удалит их.