Что делает CommonsPool2TargetSource, если вы отключаете blockWhenExhausted?
Устаревший CommonPoolTargetSource имел набор поведений, которые можно определить с помощью setWhenExhaustedActionName (). CommonsPool2TargetSource и CommonsPool2 BaseGenericObjectPool, в который он помещается, описывают getBlockWhenExhausted как
Возвращает, блокировать ли при вызове метод loanObject() при исчерпании пула
Я понял это очень много! Что это делает иначе?
Расширяется ли пул, как при установке CommonsPool на "WHEN_EXHAUSTED_GROW", или он просто генерирует исключение? Что просходит?
1 ответ
Как указано в документации, поведение ObjectPool.borrowObject () при исчерпании зависит от реализации.
Поведение этого метода, когда пул был исчерпан, не строго определено (хотя это может быть определено реализациями).
GenericObjectPool
реализация, поставляемая с CommonsPool2, будет блокироваться, если getBlockWhenExhausted()
верно и сразу бросай NoSuchElementException
иначе. (как задокументировано в GenericObjectPoolborrowObject (long loanMaxWaitMillis))
Если пул исчерпан (нет доступных незанятых экземпляров и нет возможности создавать новые), этот метод либо заблокирует (если BaseGenericObjectPool.getBlockWhenExhausted() истина), либо выдаст исключение NoSuchElementException (если BaseGenericObjectPool.getBlockWhenExhausted() - false). Время, в течение которого этот метод будет блокироваться, когда BaseGenericObjectPool.getBlockWhenExhausted() имеет значение true, определяется значением, переданным параметру loanMaxWaitMillis.
Поведение, подобное "WHEN_EXHAUSTED_GROW", недоступно и, скорее всего, достигается установкой maxTotal в -1
таким образом, бассейн не мог исчерпать вообще.