В чем разница между maxActive и maxIdle для пулов соединений Tomcat? - PullRequest
36 голосов
/ 26 февраля 2012

В пуле соединений tomcat есть настройка maxActive и настройка maxIdle.

  1. В чем разница между этими двумя настройками?
  2. Каков пример сценария реального мира, в котором значение maxActive может отличаться от значения maxIdle?

По какой-то причине документы не имеют смысла для меня.maxActive и maxIdle существуют как в dbcp apache, так и в jdbc-пуле tomact 7 в соответствии с документами на http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html

maxActive (int) Максимальное количество активных соединений, которые могут быть выделеныиз этого пула одновременно.Значение по умолчанию: 100

maxIdle (int) Максимальное количество соединений, которые должны постоянно храниться в пуле.Значение по умолчанию: maxActive: 100 Свободных соединений периодически проверяются (если они включены), и соединения, которые простаивали дольше, чем minEvictableIdleTimeMillis, будут освобождены.(также см. testWhileIdle)

Ответы [ 4 ]

32 голосов
/ 26 февраля 2012

maxActive прямо вперед. Таким образом, maxIdle можно объяснить следующим образом: допустим, у вас есть максимум 100 активных подключений и что вы установили maxIdle равным 80. При условии, что в базу данных не поступает никаких запросов, только 80 подключений будут проверены (через запрос проверки) и останутся активными. Остальные 20 будут закрыты. Таким образом, в любой момент вы можете иметь только 80 незанятых соединений.
Возможно, вы захотите установить другое значение, чтобы избежать дополнительных (ненужных) подключений к базе данных. Потому что каждое соединение, обслуживаемое базой данных, потребляет ресурсы (например, память).
Но при условии, что вы установили максимальный размер 100 и все 100 используются почти все время, этот параметр, очевидно, не будет иметь значения.

14 голосов
/ 06 января 2016

maxActive

the maximum number of active connections that can be allocated from this pool at the same time.  

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

maxIdle

(int) The maximum number of connections that should be kept in the pool **at all times.** 

Это ограничениехолостые соединения.Соединения (не превышающие значение maxIdle) не будут освобождены, так что следующий запрос на соединения будет намного быстрее.

Одним словом, maxActive ограничивает максимальное количество соединений.

Но idle (maxIdle или minIdle) больше связан с проблемой производительности (время обмена с пространством / ресурсами), среди которых maxIdle ограничивает максимальное количество соединений (ресурсов), с которыми вы собираетесь обмениваться временем.

4 голосов
/ 27 января 2015

В небольших средах соединения с базами данных не являются проблемой, поскольку соединений не так много, а ресурсы сервера практически не повреждены. В больших средах количество соединений с базой данных потребляет много ресурсов, поэтому вам необходимо оптимизировать способ управления соединениями с базой данных, используя меньшее количество возможных соединений, чтобы повысить производительность. В этом пункте maxActive устанавливает максимальное количество соединений, которые могут быть сделаны с базой данных этим пулом, ограничивая ресурсы, назначенные запрашивающей стороне. С maxIdle вы указываете, что, если соединение «находится в режиме ожидания», оно будет закрыто, если не существует минимальных соединений «maxIdle». Почему не меньше, чем maxIdle ?, потому что вам нужно, чтобы некоторые соединения были готовы для следующих запросов к базе данных, поэтому вам не нужно открывать и закрывать снова столько соединений, если пул должен быть заполнен, так что вы освобождаете много ресурсов .

2 голосов
/ 08 января 2019

Допустим, вы определили свойство как

maxActive = 100

, что по существу означает

Size of the pool = maxActive = 100

Проблема с просто maxActive

Size of pool under heavy load = maxActive
Size of pool under no/low load = maxActive

Даже при отсутствии нагрузки (none of the connections are actually in use) все 100 подключений потребляют ресурсы

Вы определенно можете уменьшить maxActive до 80. Но это также будет означать, что вы также снизите верхнюю границу доступных соединений во время большой нагрузки (when application is consuming all available connections) до 80.

Таким образом, вы застряли с maxActive в качестве размера пула

Как maxIdle решает вышеуказанную проблему

Допустим, вы определили свойства как

maxActive = 100
maxIdle = 80

, что по существу означает

Size of pool under heavy load = maxActive = 100
Size of pool under low load = maxIdle = 80

maxIdle дает пулу подключений гибкость для адаптации к нагрузке. Во время высокой нагрузки (number of connections-in use > maxIdle) maxActive является единственным свойством, которое определяет размер пула соединений

Но при отсутствии нагрузки (number of connections in-use < than maxIdle), maxIdle определяет размер пула соединений

Таким образом, правильное значение maxIdle гарантирует, что пул соединений не будет иметь ненужных последствий для производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...