Как maxIdleTimeExcessConnections отличается от maxIdleTime в c3p0?

Я хочу настроить мой пул соединений c3p0 так, чтобы по крайней мере 2 соединения всегда были активны, не более 5, а простаивающие соединения после первых 2 истекут через разумное количество времени (скажем, час).

это все звучит просто, за исключением документации, похоже, означает, что нет никакой разницы между функциями maxIdleTime и maxIdleTimeExcessConnections, что меня смущает.

базовая конфигурация бассейн гласит:

в диапазоне между minPoolSize и maxPoolSize количество соединений в пуле варьируется в зависимости от шаблонов использования. Количество подключений увеличивается всякий раз, когда соединение запрашивается пользователем, соединения недоступны, а пул еще не достиг maxPoolSize в количестве управляемых подключений. Поскольку получение соединения происходит очень медленно, почти всегда полезно увеличить количество соединений в партиях, а не заставлять каждого клиента ждать для нового соединения, чтобы спровоцировать одно приобретение, когда нагрузка увеличивается. acquireIncrement определяет, сколько соединений будет пытаться получить пул c3p0, когда у пула закончатся соединения. (Независимо от acquireIncrement, пул никогда не позволит maxPoolSize быть превышенным.)

и minPoolSize использование:

минимальное число соединений в пуле поддерживать в любой момент времени.

хорошо, отлично. И настройка времени подключения:

maxIdleTimeExcessConnections-это минимизация количества соединений, удерживаемых пулами c3p0, когда пул не находится под нагрузкой. По умолчанию пулы c3p0 растут под нагрузкой, но сжимаются только в том случае, если соединения не проходят тест соединения или истекли через параметры, описанные выше. Некоторые пользователи хотят, чтобы их пулы быстро освобождали ненужные соединения после всплеска использования, который заставляет большой размер пула. Вы можете достичь этого, установив maxIdleTimeExcessConnections к значению намного короче, чем maxIdleTime, заставляя соединения за пределы установленного минимального размера освобождаться, если они простаивают более короткого периода времени.

таким образом, подразумевается, что minPoolSize имеет значение только при использовании в сочетании с maxIdleTimeExcessConnections, иначе он будет полностью проигнорирован.

подтверждение документации для maxIdleTime не упоминает minPoolSize:

секунды соединение может остаться объединили, но неиспользованные до удаления. Ноль означает, что бездействующие соединения никогда не истекают.

и maxIdleTimeExcessConnections имеет смысл:

количество секунд, которое соединения, превышающие minPoolSize, должны быть разрешены для бездействия в пуле перед отбраковкой. Предназначен для приложений, которые хотят агрессивно минимизировать количество открытых соединений, сокращая пул обратно к minPoolSize, если после всплеска уровень нагрузки уменьшается и соединения приобретенные больше не нужны. Если maxIdleTime установлен, maxIdleTimeExcessConnections должен быть меньше, если параметр должен иметь какой-либо эффект. Ноль означает отсутствие принуждения, лишние соединения не бездействуют.

Я нахожу это очень странным, что minPoolSize, базовая функция, имеет значение только при использовании с тем, что мне кажется более продвинутой функцией. Все правильно?

2 ответов


какой внимательный и юридический читать!

но нет, это не правильно.

есть несколько способов, которыми соединение может умереть. как вы цитируете:

c3p0 бассейны...сокращение, если соединения не проходят тест соединения или истекли через параметры, описанные выше.

"параметры описанные выше" включить maxConnectionAge, maxIdleTime и maxIdleTimeExcessConnections. Соединения также можно удалить из пула, так как они не проходят тесты соединений во время простоя (см. idleConnectionTestPeriod), потому что они не проходят тесты при регистрации или при выезде (testConnectionOnCheckin, testConnectionOnCheckout), или потому, что они терпят неудачу тесты, вызванные исключением в ходе использования клиента.

однако бассейн сжимается,minPoolSize имеет значение, потому что, если пул сжимается ниже minPoolSize, разрушенные связи будет заменен на до minPoolSize восстановлена.

о maxIdleTimeExcessConnections это то, что его поведение напрямую зависит от размера пула относительно minPoolSize. все остальные параметры и тесты просто делают свое дело. если их вещь случается довести бассейн до чего-то ниже, чем minPoolSize, затем c3p0 автоматически вернет пул в minPoolSize. но!--2--> разное. это имеет какой-либо эффект, только когда пул больше, чем minPoolSize.

как вы говорите, maxIdleTimeExcessConnections дополнительная функция. большинство пользователей никогда не используют его. он был добавлен, потому что некоторые пользователи хотели агрессивно заставить пулы сжиматься до minPoolSize, но делает это с очень коротким безусловным maxIdleTime вызывает ненужный отток через соединения, как соединения даже в minPoolSize пул постоянно истекает и заменяется. установка длинного или несуществующего maxIdleTime, при установке короткого maxIdleTimeExcessConnections дает желаемый результат быстрого, агрессивного сокращения без вспенивания через соединения, как только пул попадает minPoolSize.

но даже без maxIdleTimeExcessConnections установлено, minPoolSize имеет большое значение. Соединения разрушаются и вычеркнут из бассейна, и minPoolSize определяет порог, ниже которого разрушенные соединения будут автоматически заменены, даже если загрузка клиента не приведет к расширению пула.

надеюсь, это имеет смысл!


хороший ответ Стива Walkdman, я просто хочу добавить короткий ответ:

разница в том, что maxIdleTime заменит бездействующие соединения даже в minPoolSize-D бассейны, в то время как maxIdleTimeExcessConnections не будет.